blob: f93498abe17f854de7f4582b0f3a7012b520aafd [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% %
cristy1454be72011-12-19 01:52:48 +000020% Copyright 1999-2012 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
cristy1e178e72011-08-28 19:44:34 +000069 WriteCMYKImage(const ImageInfo *,Image *,ExceptionInfo *);
cristy3ed852e2009-09-05 21:47:34 +000070
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);
cristy9950d572011-10-01 18:22:35 +0000140 image=AcquireImage(image_info,exception);
cristy3ed852e2009-09-05 21:47:34 +0000141 if ((image->columns == 0) || (image->rows == 0))
142 ThrowReaderException(OptionError,"MustSpecifyImageSize");
cristye2c4f182012-05-12 14:11:53 +0000143 SetImageColorspace(image,CMYKColorspace,exception);
cristy3ed852e2009-09-05 21:47:34 +0000144 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);
cristy387430f2012-02-07 13:09:46 +0000161 (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod,
162 exception);
cristy3ed852e2009-09-05 21:47:34 +0000163 quantum_info=AcquireQuantumInfo(image_info,canvas_image);
164 if (quantum_info == (QuantumInfo *) NULL)
165 ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
166 pixels=GetQuantumPixels(quantum_info);
167 quantum_type=CMYKQuantum;
168 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
169 {
170 quantum_type=CMYKAQuantum;
171 image->matte=MagickTrue;
172 }
173 if (image_info->number_scenes != 0)
174 while (image->scene < image_info->scene)
175 {
176 /*
177 Skip to next image.
178 */
179 image->scene++;
180 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
cristybb503372010-05-27 20:51:26 +0000181 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +0000182 {
183 count=ReadBlob(image,length,pixels);
184 if (count != (ssize_t) length)
185 break;
186 }
187 }
188 count=0;
189 length=0;
190 scene=0;
191 do
192 {
193 /*
194 Read pixels to virtual canvas image then push to image.
195 */
196 if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0))
197 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
198 break;
cristye2c4f182012-05-12 14:11:53 +0000199 SetImageColorspace(image,CMYKColorspace,exception);
cristy3ed852e2009-09-05 21:47:34 +0000200 switch (image_info->interlace)
201 {
202 case NoInterlace:
203 default:
204 {
205 /*
206 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
207 */
208 if (scene == 0)
209 {
210 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
211 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000212 }
cristybb503372010-05-27 20:51:26 +0000213 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000214 {
cristy4c08aed2011-07-01 19:47:50 +0000215 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000216 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000217
cristy4c08aed2011-07-01 19:47:50 +0000218 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000219 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000220
cristy90dbac72010-08-22 15:08:40 +0000221 register ssize_t
222 x;
223
cristy21da32d2009-09-12 14:56:09 +0000224 if (count != (ssize_t) length)
225 {
226 ThrowFileException(exception,CorruptImageError,
227 "UnexpectedEndOfFile",image->filename);
228 break;
229 }
cristy3ed852e2009-09-05 21:47:34 +0000230 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
231 exception);
cristyacd2ed22011-08-30 01:44:23 +0000232 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000233 break;
234 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
235 quantum_info,quantum_type,pixels,exception);
236 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
237 break;
238 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000239 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000240 {
241 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
242 canvas_image->columns,1,exception);
243 q=QueueAuthenticPixels(image,0,y-image->extract_info.y,
244 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000245 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000246 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000247 break;
cristybb503372010-05-27 20:51:26 +0000248 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000249 {
cristy4c08aed2011-07-01 19:47:50 +0000250 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
251 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
252 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
253 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
254 SetPixelAlpha(image,OpaqueAlpha,q);
cristy3ed852e2009-09-05 21:47:34 +0000255 if (image->matte != MagickFalse)
cristy4c08aed2011-07-01 19:47:50 +0000256 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000257 p+=GetPixelChannels(canvas_image);
258 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000259 }
260 if (SyncAuthenticPixels(image,exception) == MagickFalse)
261 break;
262 }
263 if (image->previous == (Image *) NULL)
264 {
cristycee97112010-05-28 00:44:52 +0000265 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
266 image->rows);
cristy3ed852e2009-09-05 21:47:34 +0000267 if (status == MagickFalse)
268 break;
269 }
270 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000271 }
272 break;
273 }
274 case LineInterlace:
275 {
276 static QuantumType
277 quantum_types[5] =
278 {
279 CyanQuantum,
280 MagentaQuantum,
281 YellowQuantum,
282 BlackQuantum,
283 OpacityQuantum
284 };
285
286 /*
287 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
288 */
289 if (scene == 0)
290 {
291 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
292 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000293 }
cristybb503372010-05-27 20:51:26 +0000294 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000295 {
cristy4c08aed2011-07-01 19:47:50 +0000296 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000297 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000298
cristy4c08aed2011-07-01 19:47:50 +0000299 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000300 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000301
cristy90dbac72010-08-22 15:08:40 +0000302 register ssize_t
303 x;
304
cristy21da32d2009-09-12 14:56:09 +0000305 if (count != (ssize_t) length)
306 {
307 ThrowFileException(exception,CorruptImageError,
308 "UnexpectedEndOfFile",image->filename);
309 break;
310 }
cristy3ed852e2009-09-05 21:47:34 +0000311 for (i=0; i < (image->matte != MagickFalse ? 5 : 4); i++)
312 {
313 quantum_type=quantum_types[i];
314 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
315 exception);
cristyacd2ed22011-08-30 01:44:23 +0000316 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000317 break;
318 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
319 quantum_info,quantum_type,pixels,exception);
320 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
321 break;
322 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000323 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000324 {
325 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
326 0,canvas_image->columns,1,exception);
327 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
328 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000329 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000330 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000331 break;
cristybb503372010-05-27 20:51:26 +0000332 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000333 {
334 switch (quantum_type)
335 {
cristydd5f5912010-07-31 23:37:23 +0000336 case CyanQuantum:
337 {
cristy4c08aed2011-07-01 19:47:50 +0000338 SetPixelCyan(image,GetPixelCyan(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000339 break;
340 }
341 case MagentaQuantum:
342 {
cristy4c08aed2011-07-01 19:47:50 +0000343 SetPixelMagenta(image,GetPixelMagenta(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000344 break;
345 }
346 case YellowQuantum:
347 {
cristy4c08aed2011-07-01 19:47:50 +0000348 SetPixelYellow(image,GetPixelYellow(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000349 break;
350 }
351 case BlackQuantum:
352 {
cristy4c08aed2011-07-01 19:47:50 +0000353 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000354 break;
355 }
356 case OpacityQuantum:
357 {
cristy4c08aed2011-07-01 19:47:50 +0000358 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000359 break;
360 }
361 default:
362 break;
cristy3ed852e2009-09-05 21:47:34 +0000363 }
cristyed231572011-07-14 02:18:59 +0000364 p+=GetPixelChannels(canvas_image);
365 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000366 }
367 if (SyncAuthenticPixels(image,exception) == MagickFalse)
368 break;
369 }
370 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000371 }
372 if (image->previous == (Image *) NULL)
373 {
cristycee97112010-05-28 00:44:52 +0000374 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
375 image->rows);
cristy3ed852e2009-09-05 21:47:34 +0000376 if (status == MagickFalse)
377 break;
378 }
379 }
380 break;
381 }
382 case PlaneInterlace:
383 {
384 /*
385 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
386 */
387 if (scene == 0)
388 {
389 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
390 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000391 }
cristybb503372010-05-27 20:51:26 +0000392 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000393 {
cristy4c08aed2011-07-01 19:47:50 +0000394 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000395 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000396
cristy4c08aed2011-07-01 19:47:50 +0000397 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000398 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000399
cristy90dbac72010-08-22 15:08:40 +0000400 register ssize_t
401 x;
402
cristy21da32d2009-09-12 14:56:09 +0000403 if (count != (ssize_t) length)
404 {
405 ThrowFileException(exception,CorruptImageError,
406 "UnexpectedEndOfFile",image->filename);
407 break;
408 }
cristy3ed852e2009-09-05 21:47:34 +0000409 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
410 exception);
cristyacd2ed22011-08-30 01:44:23 +0000411 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000412 break;
413 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
414 quantum_info,CyanQuantum,pixels,exception);
415 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
416 break;
417 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000418 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000419 {
420 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
421 canvas_image->columns,1,exception);
422 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
423 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000424 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000425 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000426 break;
cristybb503372010-05-27 20:51:26 +0000427 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000428 {
cristy4c08aed2011-07-01 19:47:50 +0000429 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000430 p+=GetPixelChannels(canvas_image);
431 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000432 }
433 if (SyncAuthenticPixels(image,exception) == MagickFalse)
434 break;
435 }
436 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000437 }
438 if (image->previous == (Image *) NULL)
439 {
440 status=SetImageProgress(image,LoadImageTag,1,6);
441 if (status == MagickFalse)
442 break;
443 }
cristybb503372010-05-27 20:51:26 +0000444 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000445 {
cristy4c08aed2011-07-01 19:47:50 +0000446 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000447 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000448
cristy4c08aed2011-07-01 19:47:50 +0000449 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000450 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000451
cristy90dbac72010-08-22 15:08:40 +0000452 register ssize_t
453 x;
454
cristy21da32d2009-09-12 14:56:09 +0000455 if (count != (ssize_t) length)
456 {
457 ThrowFileException(exception,CorruptImageError,
458 "UnexpectedEndOfFile",image->filename);
459 break;
460 }
cristy3ed852e2009-09-05 21:47:34 +0000461 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
462 exception);
cristyacd2ed22011-08-30 01:44:23 +0000463 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000464 break;
465 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
466 quantum_info,MagentaQuantum,pixels,exception);
467 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
468 break;
469 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000470 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000471 {
472 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
473 canvas_image->columns,1,exception);
474 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
475 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000476 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000477 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000478 break;
cristybb503372010-05-27 20:51:26 +0000479 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000480 {
cristy4c08aed2011-07-01 19:47:50 +0000481 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000482 p+=GetPixelChannels(canvas_image);
483 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000484 }
485 if (SyncAuthenticPixels(image,exception) == MagickFalse)
486 break;
487 }
488 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000489 }
490 if (image->previous == (Image *) NULL)
491 {
492 status=SetImageProgress(image,LoadImageTag,2,6);
493 if (status == MagickFalse)
494 break;
495 }
cristybb503372010-05-27 20:51:26 +0000496 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000497 {
cristy4c08aed2011-07-01 19:47:50 +0000498 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000499 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000500
cristy4c08aed2011-07-01 19:47:50 +0000501 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000502 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000503
cristy90dbac72010-08-22 15:08:40 +0000504 register ssize_t
505 x;
506
cristy21da32d2009-09-12 14:56:09 +0000507 if (count != (ssize_t) length)
508 {
509 ThrowFileException(exception,CorruptImageError,
510 "UnexpectedEndOfFile",image->filename);
511 break;
512 }
cristy3ed852e2009-09-05 21:47:34 +0000513 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
514 exception);
cristyacd2ed22011-08-30 01:44:23 +0000515 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000516 break;
517 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
518 quantum_info,YellowQuantum,pixels,exception);
519 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
520 break;
521 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000522 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000523 {
524 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
525 canvas_image->columns,1,exception);
526 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
527 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000528 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000529 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000530 break;
cristybb503372010-05-27 20:51:26 +0000531 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000532 {
cristy4c08aed2011-07-01 19:47:50 +0000533 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000534 p+=GetPixelChannels(canvas_image);
535 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000536 }
537 if (SyncAuthenticPixels(image,exception) == MagickFalse)
538 break;
539 }
540 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000541 }
542 if (image->previous == (Image *) NULL)
543 {
544 status=SetImageProgress(image,LoadImageTag,3,6);
545 if (status == MagickFalse)
546 break;
547 }
cristybb503372010-05-27 20:51:26 +0000548 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000549 {
cristy4c08aed2011-07-01 19:47:50 +0000550 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000551 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000552
cristy4c08aed2011-07-01 19:47:50 +0000553 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000554 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000555
cristy90dbac72010-08-22 15:08:40 +0000556 register ssize_t
557 x;
558
cristy21da32d2009-09-12 14:56:09 +0000559 if (count != (ssize_t) length)
560 {
561 ThrowFileException(exception,CorruptImageError,
562 "UnexpectedEndOfFile",image->filename);
563 break;
564 }
cristy3ed852e2009-09-05 21:47:34 +0000565 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
566 exception);
cristyacd2ed22011-08-30 01:44:23 +0000567 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000568 break;
569 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
570 quantum_info,BlackQuantum,pixels,exception);
571 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
572 break;
573 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000574 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000575 {
576 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
577 canvas_image->columns,1,exception);
578 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
579 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000580 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000581 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000582 break;
cristybb503372010-05-27 20:51:26 +0000583 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000584 {
cristy4c08aed2011-07-01 19:47:50 +0000585 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000586 p+=GetPixelChannels(canvas_image);
587 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000588 }
589 if (SyncAuthenticPixels(image,exception) == MagickFalse)
590 break;
591 }
592 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000593 }
594 if (image->previous == (Image *) NULL)
595 {
596 status=SetImageProgress(image,LoadImageTag,4,6);
597 if (status == MagickFalse)
598 break;
599 }
600 if (image->matte != MagickFalse)
601 {
cristybb503372010-05-27 20:51:26 +0000602 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000603 {
cristy4c08aed2011-07-01 19:47:50 +0000604 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000605 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000606
cristy4c08aed2011-07-01 19:47:50 +0000607 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000608 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000609
cristy90dbac72010-08-22 15:08:40 +0000610 register ssize_t
611 x;
612
cristy21da32d2009-09-12 14:56:09 +0000613 if (count != (ssize_t) length)
614 {
615 ThrowFileException(exception,CorruptImageError,
616 "UnexpectedEndOfFile",image->filename);
617 break;
618 }
cristy3ed852e2009-09-05 21:47:34 +0000619 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
620 exception);
cristyacd2ed22011-08-30 01:44:23 +0000621 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000622 break;
623 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
624 quantum_info,AlphaQuantum,pixels,exception);
625 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
626 break;
627 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000628 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000629 {
630 p=GetVirtualPixels(canvas_image,
631 canvas_image->extract_info.x,0,canvas_image->columns,1,
632 exception);
633 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
634 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000635 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000636 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000637 break;
cristybb503372010-05-27 20:51:26 +0000638 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000639 {
cristy4c08aed2011-07-01 19:47:50 +0000640 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000641 p+=GetPixelChannels(canvas_image);
642 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000643 }
644 if (SyncAuthenticPixels(image,exception) == MagickFalse)
645 break;
646 }
647 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000648 }
649 if (image->previous == (Image *) NULL)
650 {
651 status=SetImageProgress(image,LoadImageTag,5,6);
652 if (status == MagickFalse)
653 break;
654 }
655 }
656 if (image->previous == (Image *) NULL)
657 {
658 status=SetImageProgress(image,LoadImageTag,6,6);
659 if (status == MagickFalse)
660 break;
661 }
662 break;
663 }
664 case PartitionInterlace:
665 {
666 /*
667 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
668 */
669 AppendImageFormat("C",image->filename);
670 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
671 if (status == MagickFalse)
672 {
673 canvas_image=DestroyImageList(canvas_image);
674 image=DestroyImageList(image);
675 return((Image *) NULL);
676 }
cristyd4297022010-09-16 22:59:09 +0000677 if (DiscardBlobBytes(image,image->offset) == MagickFalse)
678 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
679 image->filename);
cristy3ed852e2009-09-05 21:47:34 +0000680 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
cristybb503372010-05-27 20:51:26 +0000681 for (i=0; i < (ssize_t) scene; i++)
682 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000683 if (ReadBlob(image,length,pixels) != (ssize_t) length)
684 {
685 ThrowFileException(exception,CorruptImageError,
686 "UnexpectedEndOfFile",image->filename);
687 break;
688 }
689 count=ReadBlob(image,length,pixels);
cristybb503372010-05-27 20:51:26 +0000690 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000691 {
cristy4c08aed2011-07-01 19:47:50 +0000692 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000693 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000694
cristy4c08aed2011-07-01 19:47:50 +0000695 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000696 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000697
cristy90dbac72010-08-22 15:08:40 +0000698 register ssize_t
699 x;
700
cristy21da32d2009-09-12 14:56:09 +0000701 if (count != (ssize_t) length)
702 {
703 ThrowFileException(exception,CorruptImageError,
704 "UnexpectedEndOfFile",image->filename);
705 break;
706 }
cristy3ed852e2009-09-05 21:47:34 +0000707 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
708 exception);
cristyacd2ed22011-08-30 01:44:23 +0000709 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000710 break;
711 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
712 quantum_info,CyanQuantum,pixels,exception);
713 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
714 break;
715 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000716 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000717 {
718 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
719 canvas_image->columns,1,exception);
720 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
721 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000722 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000723 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000724 break;
cristybb503372010-05-27 20:51:26 +0000725 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000726 {
cristy4c08aed2011-07-01 19:47:50 +0000727 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000728 p+=GetPixelChannels(canvas_image);
729 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000730 }
731 if (SyncAuthenticPixels(image,exception) == MagickFalse)
732 break;
733 }
734 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000735 }
736 if (image->previous == (Image *) NULL)
737 {
738 status=SetImageProgress(image,LoadImageTag,1,5);
739 if (status == MagickFalse)
740 break;
741 }
742 (void) CloseBlob(image);
743 AppendImageFormat("M",image->filename);
744 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
745 if (status == MagickFalse)
746 {
747 canvas_image=DestroyImageList(canvas_image);
748 image=DestroyImageList(image);
749 return((Image *) NULL);
750 }
751 length=GetQuantumExtent(canvas_image,quantum_info,MagentaQuantum);
cristybb503372010-05-27 20:51:26 +0000752 for (i=0; i < (ssize_t) scene; i++)
753 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000754 if (ReadBlob(image,length,pixels) != (ssize_t) length)
755 {
756 ThrowFileException(exception,CorruptImageError,
757 "UnexpectedEndOfFile",image->filename);
758 break;
759 }
760 count=ReadBlob(image,length,pixels);
cristybb503372010-05-27 20:51:26 +0000761 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000762 {
cristy4c08aed2011-07-01 19:47:50 +0000763 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000764 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000765
cristy4c08aed2011-07-01 19:47:50 +0000766 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000767 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000768
cristy90dbac72010-08-22 15:08:40 +0000769 register ssize_t
770 x;
771
cristy21da32d2009-09-12 14:56:09 +0000772 if (count != (ssize_t) length)
773 {
774 ThrowFileException(exception,CorruptImageError,
775 "UnexpectedEndOfFile",image->filename);
776 break;
777 }
cristy3ed852e2009-09-05 21:47:34 +0000778 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
779 exception);
cristyacd2ed22011-08-30 01:44:23 +0000780 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000781 break;
782 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
783 quantum_info,MagentaQuantum,pixels,exception);
784 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
785 break;
786 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000787 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000788 {
789 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
790 canvas_image->columns,1,exception);
791 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
792 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000793 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000794 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000795 break;
cristybb503372010-05-27 20:51:26 +0000796 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000797 {
cristy4c08aed2011-07-01 19:47:50 +0000798 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000799 p+=GetPixelChannels(canvas_image);
800 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000801 }
802 if (SyncAuthenticPixels(image,exception) == MagickFalse)
803 break;
804 }
805 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000806 }
807 if (image->previous == (Image *) NULL)
808 {
809 status=SetImageProgress(image,LoadImageTag,2,5);
810 if (status == MagickFalse)
811 break;
812 }
813 (void) CloseBlob(image);
814 AppendImageFormat("Y",image->filename);
815 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
816 if (status == MagickFalse)
817 {
818 canvas_image=DestroyImageList(canvas_image);
819 image=DestroyImageList(image);
820 return((Image *) NULL);
821 }
822 length=GetQuantumExtent(canvas_image,quantum_info,YellowQuantum);
cristybb503372010-05-27 20:51:26 +0000823 for (i=0; i < (ssize_t) scene; i++)
824 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000825 if (ReadBlob(image,length,pixels) != (ssize_t) length)
826 {
827 ThrowFileException(exception,CorruptImageError,
828 "UnexpectedEndOfFile",image->filename);
829 break;
830 }
831 count=ReadBlob(image,length,pixels);
cristybb503372010-05-27 20:51:26 +0000832 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000833 {
cristy4c08aed2011-07-01 19:47:50 +0000834 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000835 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000836
cristy4c08aed2011-07-01 19:47:50 +0000837 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000838 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000839
cristy90dbac72010-08-22 15:08:40 +0000840 register ssize_t
841 x;
842
cristy21da32d2009-09-12 14:56:09 +0000843 if (count != (ssize_t) length)
844 {
845 ThrowFileException(exception,CorruptImageError,
846 "UnexpectedEndOfFile",image->filename);
847 break;
848 }
cristy3ed852e2009-09-05 21:47:34 +0000849 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
850 exception);
cristyacd2ed22011-08-30 01:44:23 +0000851 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000852 break;
853 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
854 quantum_info,YellowQuantum,pixels,exception);
855 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
856 break;
857 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000858 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000859 {
860 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
861 canvas_image->columns,1,exception);
862 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
863 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000864 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000865 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000866 break;
cristybb503372010-05-27 20:51:26 +0000867 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000868 {
cristy4c08aed2011-07-01 19:47:50 +0000869 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000870 p+=GetPixelChannels(canvas_image);
871 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000872 }
873 if (SyncAuthenticPixels(image,exception) == MagickFalse)
874 break;
875 }
876 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000877 }
878 if (image->previous == (Image *) NULL)
879 {
880 status=SetImageProgress(image,LoadImageTag,3,5);
881 if (status == MagickFalse)
882 break;
883 }
884 (void) CloseBlob(image);
885 AppendImageFormat("K",image->filename);
886 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
887 if (status == MagickFalse)
888 {
889 canvas_image=DestroyImageList(canvas_image);
890 image=DestroyImageList(image);
891 return((Image *) NULL);
892 }
893 length=GetQuantumExtent(canvas_image,quantum_info,BlackQuantum);
cristybb503372010-05-27 20:51:26 +0000894 for (i=0; i < (ssize_t) scene; i++)
895 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000896 if (ReadBlob(image,length,pixels) != (ssize_t) length)
897 {
898 ThrowFileException(exception,CorruptImageError,
899 "UnexpectedEndOfFile",image->filename);
900 break;
901 }
902 count=ReadBlob(image,length,pixels);
cristybb503372010-05-27 20:51:26 +0000903 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000904 {
cristy4c08aed2011-07-01 19:47:50 +0000905 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000906 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000907
cristy4c08aed2011-07-01 19:47:50 +0000908 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000909 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000910
cristy90dbac72010-08-22 15:08:40 +0000911 register ssize_t
912 x;
913
cristy21da32d2009-09-12 14:56:09 +0000914 if (count != (ssize_t) length)
915 {
916 ThrowFileException(exception,CorruptImageError,
917 "UnexpectedEndOfFile",image->filename);
918 break;
919 }
cristy3ed852e2009-09-05 21:47:34 +0000920 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
921 exception);
cristyacd2ed22011-08-30 01:44:23 +0000922 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000923 break;
924 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
925 quantum_info,BlackQuantum,pixels,exception);
926 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
927 break;
928 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000929 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000930 {
931 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
932 canvas_image->columns,1,exception);
933 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
934 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000935 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000936 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000937 break;
cristybb503372010-05-27 20:51:26 +0000938 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000939 {
cristy4c08aed2011-07-01 19:47:50 +0000940 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000941 p+=GetPixelChannels(canvas_image);
942 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000943 }
944 if (SyncAuthenticPixels(image,exception) == MagickFalse)
945 break;
946 }
947 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +0000948 }
949 if (image->previous == (Image *) NULL)
950 {
951 status=SetImageProgress(image,LoadImageTag,3,5);
952 if (status == MagickFalse)
953 break;
954 }
955 if (image->matte != MagickFalse)
956 {
957 (void) CloseBlob(image);
958 AppendImageFormat("A",image->filename);
959 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
960 if (status == MagickFalse)
961 {
962 canvas_image=DestroyImageList(canvas_image);
963 image=DestroyImageList(image);
964 return((Image *) NULL);
965 }
966 length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum);
cristybb503372010-05-27 20:51:26 +0000967 for (i=0; i < (ssize_t) scene; i++)
968 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000969 if (ReadBlob(image,length,pixels) != (ssize_t) length)
970 {
971 ThrowFileException(exception,CorruptImageError,
972 "UnexpectedEndOfFile",image->filename);
973 break;
974 }
975 count=ReadBlob(image,length,pixels);
cristybb503372010-05-27 20:51:26 +0000976 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000977 {
cristy4c08aed2011-07-01 19:47:50 +0000978 register const Quantum
cristyc47d1f82009-11-26 01:44:43 +0000979 *restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000980
cristy4c08aed2011-07-01 19:47:50 +0000981 register Quantum
cristyc47d1f82009-11-26 01:44:43 +0000982 *restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000983
cristy90dbac72010-08-22 15:08:40 +0000984 register ssize_t
985 x;
986
cristy21da32d2009-09-12 14:56:09 +0000987 if (count != (ssize_t) length)
988 {
989 ThrowFileException(exception,CorruptImageError,
990 "UnexpectedEndOfFile",image->filename);
991 break;
992 }
cristy3ed852e2009-09-05 21:47:34 +0000993 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
994 exception);
cristyacd2ed22011-08-30 01:44:23 +0000995 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000996 break;
997 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
998 quantum_info,YellowQuantum,pixels,exception);
999 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
1000 break;
1001 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +00001002 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +00001003 {
1004 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
1005 0,canvas_image->columns,1,exception);
1006 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
1007 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001008 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +00001009 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +00001010 break;
cristybb503372010-05-27 20:51:26 +00001011 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +00001012 {
cristy4c08aed2011-07-01 19:47:50 +00001013 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +00001014 p+=GetPixelChannels(canvas_image);
1015 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +00001016 }
1017 if (SyncAuthenticPixels(image,exception) == MagickFalse)
1018 break;
1019 }
1020 count=ReadBlob(image,length,pixels);
cristy3ed852e2009-09-05 21:47:34 +00001021 }
1022 if (image->previous == (Image *) NULL)
1023 {
1024 status=SetImageProgress(image,LoadImageTag,4,5);
1025 if (status == MagickFalse)
1026 break;
1027 }
1028 }
1029 if (image->previous == (Image *) NULL)
1030 {
1031 status=SetImageProgress(image,LoadImageTag,5,5);
1032 if (status == MagickFalse)
1033 break;
1034 }
1035 break;
1036 }
1037 }
1038 SetQuantumImageType(image,quantum_type);
1039 /*
1040 Proceed to next image.
1041 */
1042 if (image_info->number_scenes != 0)
1043 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
1044 break;
1045 if (count == (ssize_t) length)
1046 {
1047 /*
1048 Allocate next image structure.
1049 */
cristy9950d572011-10-01 18:22:35 +00001050 AcquireNextImage(image_info,image,exception);
cristy3ed852e2009-09-05 21:47:34 +00001051 if (GetNextImageInList(image) == (Image *) NULL)
1052 {
1053 image=DestroyImageList(image);
1054 return((Image *) NULL);
1055 }
1056 image=SyncNextImageInList(image);
1057 status=SetImageProgress(image,LoadImagesTag,TellBlob(image),
1058 GetBlobSize(image));
1059 if (status == MagickFalse)
1060 break;
1061 }
1062 scene++;
1063 } while (count == (ssize_t) length);
cristy3ed852e2009-09-05 21:47:34 +00001064 quantum_info=DestroyQuantumInfo(quantum_info);
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,
cristy1e178e72011-08-28 19:44:34 +00001161% Image *image,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +00001162%
1163% A description of each parameter follows.
1164%
1165% o image_info: the image info.
1166%
1167% o image: The image.
1168%
cristy1e178e72011-08-28 19:44:34 +00001169% o exception: return any errors or warnings in this structure.
1170%
cristy3ed852e2009-09-05 21:47:34 +00001171*/
1172static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
cristy1e178e72011-08-28 19:44:34 +00001173 Image *image,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +00001174{
cristy3ed852e2009-09-05 21:47:34 +00001175 MagickBooleanType
1176 status;
1177
1178 MagickOffsetType
1179 scene;
1180
1181 QuantumInfo
1182 *quantum_info;
1183
1184 QuantumType
1185 quantum_type;
1186
cristy1e178e72011-08-28 19:44:34 +00001187 size_t
1188 length;
1189
cristy3ed852e2009-09-05 21:47:34 +00001190 ssize_t
cristy90dbac72010-08-22 15:08:40 +00001191 count,
1192 y;
cristy3ed852e2009-09-05 21:47:34 +00001193
cristy3ed852e2009-09-05 21:47:34 +00001194 unsigned char
1195 *pixels;
1196
1197 /*
1198 Allocate memory for pixels.
1199 */
1200 assert(image_info != (const ImageInfo *) NULL);
1201 assert(image_info->signature == MagickSignature);
1202 assert(image != (Image *) NULL);
1203 assert(image->signature == MagickSignature);
1204 if (image->debug != MagickFalse)
1205 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1206 if (image_info->interlace != PartitionInterlace)
1207 {
1208 /*
1209 Open output image file.
1210 */
cristyedf03fa2011-08-30 12:44:39 +00001211 status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001212 if (status == MagickFalse)
1213 return(status);
1214 }
cristy3ed852e2009-09-05 21:47:34 +00001215 scene=0;
1216 do
1217 {
1218 /*
1219 Convert MIFF to CMYK raster pixels.
1220 */
1221 if (image->colorspace != CMYKColorspace)
cristye941a752011-10-15 01:52:48 +00001222 (void) TransformImageColorspace(image,CMYKColorspace,exception);
cristy286596b2012-01-08 00:58:30 +00001223 quantum_type=CMYKQuantum;
1224 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
1225 {
1226 quantum_type=CMYKAQuantum;
1227 if (image->matte == MagickFalse)
1228 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel,exception);
1229 }
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
cristy1e178e72011-08-28 19:44:34 +00001247 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001251 quantum_type,pixels,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
cristy1e178e72011-08-28 19:44:34 +00001275 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001279 CyanQuantum,pixels,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,
cristy1e178e72011-08-28 19:44:34 +00001284 MagentaQuantum,pixels,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,
cristy1e178e72011-08-28 19:44:34 +00001289 YellowQuantum,pixels,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,
cristy1e178e72011-08-28 19:44:34 +00001294 BlackQuantum,pixels,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,
cristy1e178e72011-08-28 19:44:34 +00001301 AlphaQuantum,pixels,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
cristy1e178e72011-08-28 19:44:34 +00001326 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001330 CyanQuantum,pixels,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
cristy1e178e72011-08-28 19:44:34 +00001346 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001350 MagentaQuantum,pixels,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
cristy1e178e72011-08-28 19:44:34 +00001366 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001370 YellowQuantum,pixels,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
cristy1e178e72011-08-28 19:44:34 +00001386 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001390 BlackQuantum,pixels,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
cristy1e178e72011-08-28 19:44:34 +00001408 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001412 AlphaQuantum,pixels,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 :
cristy1e178e72011-08-28 19:44:34 +00001442 AppendBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001443 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
cristy1e178e72011-08-28 19:44:34 +00001450 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001454 CyanQuantum,pixels,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 :
cristy1e178e72011-08-28 19:44:34 +00001468 AppendBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001469 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
cristy1e178e72011-08-28 19:44:34 +00001476 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001480 MagentaQuantum,pixels,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 :
cristy1e178e72011-08-28 19:44:34 +00001494 AppendBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001495 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
cristy1e178e72011-08-28 19:44:34 +00001502 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001506 YellowQuantum,pixels,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 :
cristy1e178e72011-08-28 19:44:34 +00001520 AppendBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001521 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
cristy1e178e72011-08-28 19:44:34 +00001528 p=GetVirtualPixels(image,0,y,image->columns,1,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,
cristy1e178e72011-08-28 19:44:34 +00001532 BlackQuantum,pixels,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 :
cristy1e178e72011-08-28 19:44:34 +00001548 AppendBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001549 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
cristy1e178e72011-08-28 19:44:34 +00001556 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001557 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001558 break;
cristy4c08aed2011-07-01 19:47:50 +00001559 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001560 AlphaQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001561 count=WriteBlob(image,length,pixels);
1562 if (count != (ssize_t) length)
1563 break;
1564 }
1565 if (image->previous == (Image *) NULL)
1566 {
1567 status=SetImageProgress(image,SaveImageTag,5,6);
1568 if (status == MagickFalse)
1569 break;
1570 }
1571 }
1572 (void) CloseBlob(image);
1573 (void) CopyMagickString(image->filename,image_info->filename,
1574 MaxTextExtent);
1575 if (image->previous == (Image *) NULL)
1576 {
1577 status=SetImageProgress(image,SaveImageTag,6,6);
1578 if (status == MagickFalse)
1579 break;
1580 }
1581 break;
1582 }
1583 }
1584 quantum_info=DestroyQuantumInfo(quantum_info);
1585 if (GetNextImageInList(image) == (Image *) NULL)
1586 break;
1587 image=SyncNextImageInList(image);
1588 status=SetImageProgress(image,SaveImagesTag,scene++,
1589 GetImageListLength(image));
1590 if (status == MagickFalse)
1591 break;
1592 } while (image_info->adjoin != MagickFalse);
1593 (void) CloseBlob(image);
1594 return(MagickTrue);
1595}