blob: 6d964fb52983b7c29e9b8b6eccd56bed21e20861 [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 %
cristyde984cd2013-12-01 14:49:27 +000016% Cristy %
cristy3ed852e2009-09-05 21:47:34 +000017% July 1992 %
18% %
19% %
Cristy7ce65e72015-12-12 18:03:16 -050020% Copyright 1999-2016 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"
cristy6a2180c2013-05-27 10:28:36 +000046#include "MagickCore/channel.h"
cristy4c08aed2011-07-01 19:47:50 +000047#include "MagickCore/colorspace.h"
48#include "MagickCore/constitute.h"
49#include "MagickCore/exception.h"
50#include "MagickCore/exception-private.h"
51#include "MagickCore/image.h"
52#include "MagickCore/image-private.h"
53#include "MagickCore/list.h"
54#include "MagickCore/magick.h"
55#include "MagickCore/memory_.h"
56#include "MagickCore/monitor.h"
57#include "MagickCore/monitor-private.h"
58#include "MagickCore/pixel-accessor.h"
59#include "MagickCore/quantum-private.h"
60#include "MagickCore/static.h"
61#include "MagickCore/statistic.h"
62#include "MagickCore/string_.h"
63#include "MagickCore/module.h"
64#include "MagickCore/utility.h"
cristy3ed852e2009-09-05 21:47:34 +000065
66/*
67 Forward declarations.
68*/
69static MagickBooleanType
cristy1e178e72011-08-28 19:44:34 +000070 WriteCMYKImage(const ImageInfo *,Image *,ExceptionInfo *);
cristy3ed852e2009-09-05 21:47:34 +000071
72/*
73%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
74% %
75% %
76% %
77% R e a d C M Y K I m a g e %
78% %
79% %
80% %
81%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
82%
83% ReadCMYKImage() reads an image of raw CMYK or CMYKA samples and returns it.
84% It allocates the memory necessary for the new Image structure and returns a
85% pointer to the new image.
86%
87% The format of the ReadCMYKImage method is:
88%
89% Image *ReadCMYKImage(const ImageInfo *image_info,
90% ExceptionInfo *exception)
91%
92% A description of each parameter follows:
93%
94% o image_info: the image info.
95%
96% o exception: return any errors or warnings in this structure.
97%
98*/
99static Image *ReadCMYKImage(const ImageInfo *image_info,
100 ExceptionInfo *exception)
101{
cristyb3f97ae2015-05-18 12:29:32 +0000102 const unsigned char
cristybd797f12015-01-24 20:42:32 +0000103 *pixels;
104
cristy3ed852e2009-09-05 21:47:34 +0000105 Image
106 *canvas_image,
107 *image;
108
cristy3ed852e2009-09-05 21:47:34 +0000109 MagickBooleanType
110 status;
111
112 MagickOffsetType
113 scene;
114
115 QuantumInfo
116 *quantum_info;
117
118 QuantumType
119 quantum_type;
120
cristybb503372010-05-27 20:51:26 +0000121 register ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000122 i;
123
cristy4e82e512011-04-24 01:33:42 +0000124 size_t
125 length;
126
cristy3ed852e2009-09-05 21:47:34 +0000127 ssize_t
cristy90dbac72010-08-22 15:08:40 +0000128 count,
129 y;
cristy3ed852e2009-09-05 21:47:34 +0000130
cristy3ed852e2009-09-05 21:47:34 +0000131 /*
132 Open image file.
133 */
134 assert(image_info != (const ImageInfo *) NULL);
cristye1c94d92015-06-28 12:16:33 +0000135 assert(image_info->signature == MagickCoreSignature);
cristy3ed852e2009-09-05 21:47:34 +0000136 if (image_info->debug != MagickFalse)
137 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
138 image_info->filename);
139 assert(exception != (ExceptionInfo *) NULL);
cristye1c94d92015-06-28 12:16:33 +0000140 assert(exception->signature == MagickCoreSignature);
cristy9950d572011-10-01 18:22:35 +0000141 image=AcquireImage(image_info,exception);
cristy3ed852e2009-09-05 21:47:34 +0000142 if ((image->columns == 0) || (image->rows == 0))
143 ThrowReaderException(OptionError,"MustSpecifyImageSize");
cristye2c4f182012-05-12 14:11:53 +0000144 SetImageColorspace(image,CMYKColorspace,exception);
cristy3ed852e2009-09-05 21:47:34 +0000145 if (image_info->interlace != PartitionInterlace)
146 {
147 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
148 if (status == MagickFalse)
149 {
150 image=DestroyImageList(image);
151 return((Image *) NULL);
152 }
cristyd4297022010-09-16 22:59:09 +0000153 if (DiscardBlobBytes(image,image->offset) == MagickFalse)
154 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
155 image->filename);
cristy3ed852e2009-09-05 21:47:34 +0000156 }
157 /*
158 Create virtual canvas to support cropping (i.e. image.cmyk[100x100+10+20]).
159 */
160 canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse,
161 exception);
cristy387430f2012-02-07 13:09:46 +0000162 (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod,
163 exception);
cristy5f766ef2014-12-14 21:12:47 +0000164 quantum_info=AcquireQuantumInfo(image_info,canvas_image);
cristy3ed852e2009-09-05 21:47:34 +0000165 if (quantum_info == (QuantumInfo *) NULL)
166 ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
cristy3ed852e2009-09-05 21:47:34 +0000167 quantum_type=CMYKQuantum;
168 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
169 {
170 quantum_type=CMYKAQuantum;
cristy8a46d822012-08-28 23:32:39 +0000171 image->alpha_trait=BlendPixelTrait;
cristy3ed852e2009-09-05 21:47:34 +0000172 }
cristyb3f97ae2015-05-18 12:29:32 +0000173 pixels=(const unsigned char *) NULL;
cristy3ed852e2009-09-05 21:47:34 +0000174 if (image_info->number_scenes != 0)
175 while (image->scene < image_info->scene)
176 {
177 /*
178 Skip to next image.
179 */
180 image->scene++;
181 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
cristybb503372010-05-27 20:51:26 +0000182 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +0000183 {
cristyb3f97ae2015-05-18 12:29:32 +0000184 pixels=(const unsigned char *) ReadBlobStream(image,length,
185 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000186 if (count != (ssize_t) length)
187 break;
188 }
189 }
190 count=0;
191 length=0;
192 scene=0;
193 do
194 {
195 /*
196 Read pixels to virtual canvas image then push to image.
197 */
198 if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0))
199 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
200 break;
cristyacabb842014-12-14 23:36:33 +0000201 status=SetImageExtent(image,image->columns,image->rows,exception);
202 if (status == MagickFalse)
203 return(DestroyImageList(image));
cristye2c4f182012-05-12 14:11:53 +0000204 SetImageColorspace(image,CMYKColorspace,exception);
cristy3ed852e2009-09-05 21:47:34 +0000205 switch (image_info->interlace)
206 {
207 case NoInterlace:
208 default:
209 {
210 /*
211 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
212 */
213 if (scene == 0)
214 {
215 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
cristyb3f97ae2015-05-18 12:29:32 +0000216 pixels=(const unsigned char *) ReadBlobStream(image,length,
217 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000218 }
cristybb503372010-05-27 20:51:26 +0000219 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000220 {
cristy4c08aed2011-07-01 19:47:50 +0000221 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100222 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000223
cristy4c08aed2011-07-01 19:47:50 +0000224 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100225 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000226
cristy90dbac72010-08-22 15:08:40 +0000227 register ssize_t
228 x;
229
cristy21da32d2009-09-12 14:56:09 +0000230 if (count != (ssize_t) length)
231 {
232 ThrowFileException(exception,CorruptImageError,
233 "UnexpectedEndOfFile",image->filename);
234 break;
235 }
cristy3ed852e2009-09-05 21:47:34 +0000236 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
237 exception);
cristyacd2ed22011-08-30 01:44:23 +0000238 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000239 break;
240 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
241 quantum_info,quantum_type,pixels,exception);
242 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
243 break;
244 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000245 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000246 {
247 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
248 canvas_image->columns,1,exception);
249 q=QueueAuthenticPixels(image,0,y-image->extract_info.y,
250 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000251 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000252 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000253 break;
cristybb503372010-05-27 20:51:26 +0000254 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000255 {
cristy4c08aed2011-07-01 19:47:50 +0000256 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
257 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
258 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
259 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
260 SetPixelAlpha(image,OpaqueAlpha,q);
cristy17f11b02014-12-20 19:37:04 +0000261 if (image->alpha_trait != UndefinedPixelTrait)
cristy4c08aed2011-07-01 19:47:50 +0000262 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000263 p+=GetPixelChannels(canvas_image);
264 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000265 }
266 if (SyncAuthenticPixels(image,exception) == MagickFalse)
267 break;
268 }
269 if (image->previous == (Image *) NULL)
270 {
cristycee97112010-05-28 00:44:52 +0000271 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
272 image->rows);
cristy3ed852e2009-09-05 21:47:34 +0000273 if (status == MagickFalse)
274 break;
275 }
cristyb3f97ae2015-05-18 12:29:32 +0000276 pixels=(const unsigned char *) ReadBlobStream(image,length,
277 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000278 }
279 break;
280 }
281 case LineInterlace:
282 {
283 static QuantumType
284 quantum_types[5] =
285 {
286 CyanQuantum,
287 MagentaQuantum,
288 YellowQuantum,
289 BlackQuantum,
290 OpacityQuantum
291 };
292
293 /*
294 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
295 */
296 if (scene == 0)
297 {
298 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
cristyb3f97ae2015-05-18 12:29:32 +0000299 pixels=(const unsigned char *) ReadBlobStream(image,length,
300 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000301 }
cristybb503372010-05-27 20:51:26 +0000302 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000303 {
cristy4c08aed2011-07-01 19:47:50 +0000304 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100305 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000306
cristy4c08aed2011-07-01 19:47:50 +0000307 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100308 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000309
cristy90dbac72010-08-22 15:08:40 +0000310 register ssize_t
311 x;
312
cristy21da32d2009-09-12 14:56:09 +0000313 if (count != (ssize_t) length)
314 {
315 ThrowFileException(exception,CorruptImageError,
316 "UnexpectedEndOfFile",image->filename);
317 break;
318 }
cristy17f11b02014-12-20 19:37:04 +0000319 for (i=0; i < (image->alpha_trait != UndefinedPixelTrait ? 5 : 4); i++)
cristy3ed852e2009-09-05 21:47:34 +0000320 {
321 quantum_type=quantum_types[i];
322 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
323 exception);
cristyacd2ed22011-08-30 01:44:23 +0000324 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000325 break;
326 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
327 quantum_info,quantum_type,pixels,exception);
328 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
329 break;
330 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000331 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000332 {
333 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
334 0,canvas_image->columns,1,exception);
335 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
336 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000337 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000338 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000339 break;
cristybb503372010-05-27 20:51:26 +0000340 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000341 {
342 switch (quantum_type)
343 {
cristydd5f5912010-07-31 23:37:23 +0000344 case CyanQuantum:
345 {
cristy4c08aed2011-07-01 19:47:50 +0000346 SetPixelCyan(image,GetPixelCyan(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000347 break;
348 }
349 case MagentaQuantum:
350 {
cristy4c08aed2011-07-01 19:47:50 +0000351 SetPixelMagenta(image,GetPixelMagenta(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000352 break;
353 }
354 case YellowQuantum:
355 {
cristy4c08aed2011-07-01 19:47:50 +0000356 SetPixelYellow(image,GetPixelYellow(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000357 break;
358 }
359 case BlackQuantum:
360 {
cristy4c08aed2011-07-01 19:47:50 +0000361 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000362 break;
363 }
364 case OpacityQuantum:
365 {
cristy4c08aed2011-07-01 19:47:50 +0000366 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristydd5f5912010-07-31 23:37:23 +0000367 break;
368 }
369 default:
370 break;
cristy3ed852e2009-09-05 21:47:34 +0000371 }
cristyed231572011-07-14 02:18:59 +0000372 p+=GetPixelChannels(canvas_image);
373 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000374 }
375 if (SyncAuthenticPixels(image,exception) == MagickFalse)
376 break;
377 }
cristyb3f97ae2015-05-18 12:29:32 +0000378 pixels=(const unsigned char *) ReadBlobStream(image,length,
379 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000380 }
381 if (image->previous == (Image *) NULL)
382 {
cristycee97112010-05-28 00:44:52 +0000383 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
384 image->rows);
cristy3ed852e2009-09-05 21:47:34 +0000385 if (status == MagickFalse)
386 break;
387 }
388 }
389 break;
390 }
391 case PlaneInterlace:
392 {
393 /*
394 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
395 */
396 if (scene == 0)
397 {
398 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
cristyb3f97ae2015-05-18 12:29:32 +0000399 pixels=(const unsigned char *) ReadBlobStream(image,length,
400 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000401 }
cristybb503372010-05-27 20:51:26 +0000402 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000403 {
cristy4c08aed2011-07-01 19:47:50 +0000404 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100405 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000406
cristy4c08aed2011-07-01 19:47:50 +0000407 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100408 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000409
cristy90dbac72010-08-22 15:08:40 +0000410 register ssize_t
411 x;
412
cristy21da32d2009-09-12 14:56:09 +0000413 if (count != (ssize_t) length)
414 {
415 ThrowFileException(exception,CorruptImageError,
416 "UnexpectedEndOfFile",image->filename);
417 break;
418 }
cristy3ed852e2009-09-05 21:47:34 +0000419 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
420 exception);
cristyacd2ed22011-08-30 01:44:23 +0000421 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000422 break;
423 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
424 quantum_info,CyanQuantum,pixels,exception);
425 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
426 break;
427 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000428 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000429 {
430 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
431 canvas_image->columns,1,exception);
432 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
433 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000434 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000435 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000436 break;
cristybb503372010-05-27 20:51:26 +0000437 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000438 {
cristy4c08aed2011-07-01 19:47:50 +0000439 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000440 p+=GetPixelChannels(canvas_image);
441 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000442 }
443 if (SyncAuthenticPixels(image,exception) == MagickFalse)
444 break;
445 }
cristyb3f97ae2015-05-18 12:29:32 +0000446 pixels=(const unsigned char *) ReadBlobStream(image,length,
447 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000448 }
449 if (image->previous == (Image *) NULL)
450 {
451 status=SetImageProgress(image,LoadImageTag,1,6);
452 if (status == MagickFalse)
453 break;
454 }
cristybb503372010-05-27 20:51:26 +0000455 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000456 {
cristy4c08aed2011-07-01 19:47:50 +0000457 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100458 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000459
cristy4c08aed2011-07-01 19:47:50 +0000460 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100461 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000462
cristy90dbac72010-08-22 15:08:40 +0000463 register ssize_t
464 x;
465
cristy21da32d2009-09-12 14:56:09 +0000466 if (count != (ssize_t) length)
467 {
468 ThrowFileException(exception,CorruptImageError,
469 "UnexpectedEndOfFile",image->filename);
470 break;
471 }
cristy3ed852e2009-09-05 21:47:34 +0000472 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
473 exception);
cristyacd2ed22011-08-30 01:44:23 +0000474 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000475 break;
476 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
477 quantum_info,MagentaQuantum,pixels,exception);
478 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
479 break;
480 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000481 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000482 {
483 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
484 canvas_image->columns,1,exception);
485 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
486 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000487 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000488 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000489 break;
cristybb503372010-05-27 20:51:26 +0000490 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000491 {
cristy4c08aed2011-07-01 19:47:50 +0000492 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000493 p+=GetPixelChannels(canvas_image);
494 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000495 }
496 if (SyncAuthenticPixels(image,exception) == MagickFalse)
497 break;
498 }
cristyb3f97ae2015-05-18 12:29:32 +0000499 pixels=(const unsigned char *) ReadBlobStream(image,length,
500 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000501 }
502 if (image->previous == (Image *) NULL)
503 {
504 status=SetImageProgress(image,LoadImageTag,2,6);
505 if (status == MagickFalse)
506 break;
507 }
cristybb503372010-05-27 20:51:26 +0000508 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000509 {
cristy4c08aed2011-07-01 19:47:50 +0000510 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100511 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000512
cristy4c08aed2011-07-01 19:47:50 +0000513 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100514 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000515
cristy90dbac72010-08-22 15:08:40 +0000516 register ssize_t
517 x;
518
cristy21da32d2009-09-12 14:56:09 +0000519 if (count != (ssize_t) length)
520 {
521 ThrowFileException(exception,CorruptImageError,
522 "UnexpectedEndOfFile",image->filename);
523 break;
524 }
cristy3ed852e2009-09-05 21:47:34 +0000525 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
526 exception);
cristyacd2ed22011-08-30 01:44:23 +0000527 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000528 break;
529 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
530 quantum_info,YellowQuantum,pixels,exception);
531 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
532 break;
533 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000534 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000535 {
536 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
537 canvas_image->columns,1,exception);
538 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
539 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000540 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000541 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000542 break;
cristybb503372010-05-27 20:51:26 +0000543 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000544 {
cristy4c08aed2011-07-01 19:47:50 +0000545 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000546 p+=GetPixelChannels(canvas_image);
547 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000548 }
549 if (SyncAuthenticPixels(image,exception) == MagickFalse)
550 break;
551 }
cristyb3f97ae2015-05-18 12:29:32 +0000552 pixels=(const unsigned char *) ReadBlobStream(image,length,
553 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000554 }
555 if (image->previous == (Image *) NULL)
556 {
557 status=SetImageProgress(image,LoadImageTag,3,6);
558 if (status == MagickFalse)
559 break;
560 }
cristybb503372010-05-27 20:51:26 +0000561 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000562 {
cristy4c08aed2011-07-01 19:47:50 +0000563 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100564 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000565
cristy4c08aed2011-07-01 19:47:50 +0000566 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100567 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000568
cristy90dbac72010-08-22 15:08:40 +0000569 register ssize_t
570 x;
571
cristy21da32d2009-09-12 14:56:09 +0000572 if (count != (ssize_t) length)
573 {
574 ThrowFileException(exception,CorruptImageError,
575 "UnexpectedEndOfFile",image->filename);
576 break;
577 }
cristy3ed852e2009-09-05 21:47:34 +0000578 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
579 exception);
cristyacd2ed22011-08-30 01:44:23 +0000580 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000581 break;
582 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
583 quantum_info,BlackQuantum,pixels,exception);
584 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
585 break;
586 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000587 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000588 {
589 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
590 canvas_image->columns,1,exception);
591 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
592 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000593 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000594 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000595 break;
cristybb503372010-05-27 20:51:26 +0000596 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000597 {
cristy4c08aed2011-07-01 19:47:50 +0000598 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000599 p+=GetPixelChannels(canvas_image);
600 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000601 }
602 if (SyncAuthenticPixels(image,exception) == MagickFalse)
603 break;
604 }
cristyb3f97ae2015-05-18 12:29:32 +0000605 pixels=(const unsigned char *) ReadBlobStream(image,length,
606 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000607 }
608 if (image->previous == (Image *) NULL)
609 {
610 status=SetImageProgress(image,LoadImageTag,4,6);
611 if (status == MagickFalse)
612 break;
613 }
cristy17f11b02014-12-20 19:37:04 +0000614 if (image->alpha_trait != UndefinedPixelTrait)
cristy3ed852e2009-09-05 21:47:34 +0000615 {
cristybb503372010-05-27 20:51:26 +0000616 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000617 {
cristy4c08aed2011-07-01 19:47:50 +0000618 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100619 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000620
cristy4c08aed2011-07-01 19:47:50 +0000621 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100622 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000623
cristy90dbac72010-08-22 15:08:40 +0000624 register ssize_t
625 x;
626
cristy21da32d2009-09-12 14:56:09 +0000627 if (count != (ssize_t) length)
628 {
629 ThrowFileException(exception,CorruptImageError,
630 "UnexpectedEndOfFile",image->filename);
631 break;
632 }
cristy3ed852e2009-09-05 21:47:34 +0000633 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
634 exception);
cristyacd2ed22011-08-30 01:44:23 +0000635 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000636 break;
637 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
638 quantum_info,AlphaQuantum,pixels,exception);
639 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
640 break;
641 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000642 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000643 {
644 p=GetVirtualPixels(canvas_image,
645 canvas_image->extract_info.x,0,canvas_image->columns,1,
646 exception);
647 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
648 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000649 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000650 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000651 break;
cristybb503372010-05-27 20:51:26 +0000652 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000653 {
cristy4c08aed2011-07-01 19:47:50 +0000654 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000655 p+=GetPixelChannels(canvas_image);
656 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000657 }
658 if (SyncAuthenticPixels(image,exception) == MagickFalse)
659 break;
660 }
cristyb3f97ae2015-05-18 12:29:32 +0000661 pixels=(const unsigned char *) ReadBlobStream(image,length,
662 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000663 }
664 if (image->previous == (Image *) NULL)
665 {
666 status=SetImageProgress(image,LoadImageTag,5,6);
667 if (status == MagickFalse)
668 break;
669 }
670 }
671 if (image->previous == (Image *) NULL)
672 {
673 status=SetImageProgress(image,LoadImageTag,6,6);
674 if (status == MagickFalse)
675 break;
676 }
677 break;
678 }
679 case PartitionInterlace:
680 {
681 /*
682 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
683 */
684 AppendImageFormat("C",image->filename);
685 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
686 if (status == MagickFalse)
687 {
688 canvas_image=DestroyImageList(canvas_image);
689 image=DestroyImageList(image);
690 return((Image *) NULL);
691 }
cristyd4297022010-09-16 22:59:09 +0000692 if (DiscardBlobBytes(image,image->offset) == MagickFalse)
693 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
694 image->filename);
cristy3ed852e2009-09-05 21:47:34 +0000695 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
cristybb503372010-05-27 20:51:26 +0000696 for (i=0; i < (ssize_t) scene; i++)
697 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristybd797f12015-01-24 20:42:32 +0000698 {
cristyb3f97ae2015-05-18 12:29:32 +0000699 pixels=(const unsigned char *) ReadBlobStream(image,length,
700 GetQuantumPixels(quantum_info),&count);
cristybd797f12015-01-24 20:42:32 +0000701 if (count != (ssize_t) length)
cristy3ed852e2009-09-05 21:47:34 +0000702 {
703 ThrowFileException(exception,CorruptImageError,
704 "UnexpectedEndOfFile",image->filename);
705 break;
706 }
cristybd797f12015-01-24 20:42:32 +0000707 }
cristyb3f97ae2015-05-18 12:29:32 +0000708 pixels=(const unsigned char *) ReadBlobStream(image,length,
709 GetQuantumPixels(quantum_info),&count);
cristybb503372010-05-27 20:51:26 +0000710 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000711 {
cristy4c08aed2011-07-01 19:47:50 +0000712 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100713 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000714
cristy4c08aed2011-07-01 19:47:50 +0000715 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100716 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000717
cristy90dbac72010-08-22 15:08:40 +0000718 register ssize_t
719 x;
720
cristy21da32d2009-09-12 14:56:09 +0000721 if (count != (ssize_t) length)
722 {
723 ThrowFileException(exception,CorruptImageError,
724 "UnexpectedEndOfFile",image->filename);
725 break;
726 }
cristy3ed852e2009-09-05 21:47:34 +0000727 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
728 exception);
cristyacd2ed22011-08-30 01:44:23 +0000729 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000730 break;
731 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
732 quantum_info,CyanQuantum,pixels,exception);
733 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
734 break;
735 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000736 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000737 {
738 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
739 canvas_image->columns,1,exception);
740 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
741 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000742 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000743 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000744 break;
cristybb503372010-05-27 20:51:26 +0000745 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000746 {
cristy4c08aed2011-07-01 19:47:50 +0000747 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000748 p+=GetPixelChannels(canvas_image);
749 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000750 }
751 if (SyncAuthenticPixels(image,exception) == MagickFalse)
752 break;
753 }
cristyb3f97ae2015-05-18 12:29:32 +0000754 pixels=(const unsigned char *) ReadBlobStream(image,length,
755 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000756 }
757 if (image->previous == (Image *) NULL)
758 {
759 status=SetImageProgress(image,LoadImageTag,1,5);
760 if (status == MagickFalse)
761 break;
762 }
763 (void) CloseBlob(image);
764 AppendImageFormat("M",image->filename);
765 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
766 if (status == MagickFalse)
767 {
768 canvas_image=DestroyImageList(canvas_image);
769 image=DestroyImageList(image);
770 return((Image *) NULL);
771 }
772 length=GetQuantumExtent(canvas_image,quantum_info,MagentaQuantum);
cristybb503372010-05-27 20:51:26 +0000773 for (i=0; i < (ssize_t) scene; i++)
774 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristybd797f12015-01-24 20:42:32 +0000775 {
cristyb3f97ae2015-05-18 12:29:32 +0000776 pixels=(const unsigned char *) ReadBlobStream(image,length,
777 GetQuantumPixels(quantum_info),&count);
cristybd797f12015-01-24 20:42:32 +0000778 if (count != (ssize_t) length)
cristy3ed852e2009-09-05 21:47:34 +0000779 {
780 ThrowFileException(exception,CorruptImageError,
781 "UnexpectedEndOfFile",image->filename);
782 break;
783 }
cristybd797f12015-01-24 20:42:32 +0000784 }
cristyb3f97ae2015-05-18 12:29:32 +0000785 pixels=(const unsigned char *) ReadBlobStream(image,length,
786 GetQuantumPixels(quantum_info),&count);
cristybb503372010-05-27 20:51:26 +0000787 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000788 {
cristy4c08aed2011-07-01 19:47:50 +0000789 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100790 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000791
cristy4c08aed2011-07-01 19:47:50 +0000792 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100793 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000794
cristy90dbac72010-08-22 15:08:40 +0000795 register ssize_t
796 x;
797
cristy21da32d2009-09-12 14:56:09 +0000798 if (count != (ssize_t) length)
799 {
800 ThrowFileException(exception,CorruptImageError,
801 "UnexpectedEndOfFile",image->filename);
802 break;
803 }
cristy3ed852e2009-09-05 21:47:34 +0000804 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
805 exception);
cristyacd2ed22011-08-30 01:44:23 +0000806 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000807 break;
808 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
809 quantum_info,MagentaQuantum,pixels,exception);
810 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
811 break;
812 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000813 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000814 {
815 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
816 canvas_image->columns,1,exception);
817 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
818 image->columns,1,exception);
cristybd797f12015-01-24 20:42:32 +0000819 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000820 break;
cristybb503372010-05-27 20:51:26 +0000821 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000822 {
cristy4c08aed2011-07-01 19:47:50 +0000823 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000824 p+=GetPixelChannels(canvas_image);
825 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000826 }
827 if (SyncAuthenticPixels(image,exception) == MagickFalse)
828 break;
829 }
cristyb3f97ae2015-05-18 12:29:32 +0000830 pixels=(const unsigned char *) ReadBlobStream(image,length,
831 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000832 }
833 if (image->previous == (Image *) NULL)
834 {
835 status=SetImageProgress(image,LoadImageTag,2,5);
836 if (status == MagickFalse)
837 break;
838 }
839 (void) CloseBlob(image);
840 AppendImageFormat("Y",image->filename);
841 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
842 if (status == MagickFalse)
843 {
844 canvas_image=DestroyImageList(canvas_image);
845 image=DestroyImageList(image);
846 return((Image *) NULL);
847 }
848 length=GetQuantumExtent(canvas_image,quantum_info,YellowQuantum);
cristybb503372010-05-27 20:51:26 +0000849 for (i=0; i < (ssize_t) scene; i++)
850 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristybd797f12015-01-24 20:42:32 +0000851 {
cristyb3f97ae2015-05-18 12:29:32 +0000852 pixels=(const unsigned char *) ReadBlobStream(image,length,
853 GetQuantumPixels(quantum_info),&count);
cristybd797f12015-01-24 20:42:32 +0000854 if (count != (ssize_t) length)
cristy3ed852e2009-09-05 21:47:34 +0000855 {
856 ThrowFileException(exception,CorruptImageError,
857 "UnexpectedEndOfFile",image->filename);
858 break;
859 }
cristybd797f12015-01-24 20:42:32 +0000860 }
cristyb3f97ae2015-05-18 12:29:32 +0000861 pixels=(const unsigned char *) ReadBlobStream(image,length,
862 GetQuantumPixels(quantum_info),&count);
cristybb503372010-05-27 20:51:26 +0000863 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000864 {
cristy4c08aed2011-07-01 19:47:50 +0000865 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100866 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000867
cristy4c08aed2011-07-01 19:47:50 +0000868 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100869 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000870
cristy90dbac72010-08-22 15:08:40 +0000871 register ssize_t
872 x;
873
cristy21da32d2009-09-12 14:56:09 +0000874 if (count != (ssize_t) length)
875 {
876 ThrowFileException(exception,CorruptImageError,
877 "UnexpectedEndOfFile",image->filename);
878 break;
879 }
cristy3ed852e2009-09-05 21:47:34 +0000880 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
881 exception);
cristyacd2ed22011-08-30 01:44:23 +0000882 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000883 break;
884 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
885 quantum_info,YellowQuantum,pixels,exception);
886 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
887 break;
888 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000889 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000890 {
891 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
892 canvas_image->columns,1,exception);
893 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
894 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000895 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000896 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000897 break;
cristybb503372010-05-27 20:51:26 +0000898 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000899 {
cristy4c08aed2011-07-01 19:47:50 +0000900 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000901 p+=GetPixelChannels(canvas_image);
902 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000903 }
904 if (SyncAuthenticPixels(image,exception) == MagickFalse)
905 break;
906 }
cristyb3f97ae2015-05-18 12:29:32 +0000907 pixels=(const unsigned char *) ReadBlobStream(image,length,
908 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000909 }
910 if (image->previous == (Image *) NULL)
911 {
912 status=SetImageProgress(image,LoadImageTag,3,5);
913 if (status == MagickFalse)
914 break;
915 }
916 (void) CloseBlob(image);
917 AppendImageFormat("K",image->filename);
918 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
919 if (status == MagickFalse)
920 {
921 canvas_image=DestroyImageList(canvas_image);
922 image=DestroyImageList(image);
923 return((Image *) NULL);
924 }
925 length=GetQuantumExtent(canvas_image,quantum_info,BlackQuantum);
cristybb503372010-05-27 20:51:26 +0000926 for (i=0; i < (ssize_t) scene; i++)
927 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristybd797f12015-01-24 20:42:32 +0000928 {
cristyb3f97ae2015-05-18 12:29:32 +0000929 pixels=(const unsigned char *) ReadBlobStream(image,length,
930 GetQuantumPixels(quantum_info),&count);
cristybd797f12015-01-24 20:42:32 +0000931 if (count != (ssize_t) length)
cristy3ed852e2009-09-05 21:47:34 +0000932 {
933 ThrowFileException(exception,CorruptImageError,
934 "UnexpectedEndOfFile",image->filename);
935 break;
936 }
cristybd797f12015-01-24 20:42:32 +0000937 }
cristyb3f97ae2015-05-18 12:29:32 +0000938 pixels=(const unsigned char *) ReadBlobStream(image,length,
939 GetQuantumPixels(quantum_info),&count);
cristybb503372010-05-27 20:51:26 +0000940 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +0000941 {
cristy4c08aed2011-07-01 19:47:50 +0000942 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +0100943 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +0000944
cristy4c08aed2011-07-01 19:47:50 +0000945 register Quantum
dirk05d2ff72015-11-18 23:13:43 +0100946 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +0000947
cristy90dbac72010-08-22 15:08:40 +0000948 register ssize_t
949 x;
950
cristy21da32d2009-09-12 14:56:09 +0000951 if (count != (ssize_t) length)
952 {
953 ThrowFileException(exception,CorruptImageError,
954 "UnexpectedEndOfFile",image->filename);
955 break;
956 }
cristy3ed852e2009-09-05 21:47:34 +0000957 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
958 exception);
cristyacd2ed22011-08-30 01:44:23 +0000959 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000960 break;
961 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
962 quantum_info,BlackQuantum,pixels,exception);
963 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
964 break;
965 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +0000966 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +0000967 {
968 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
969 canvas_image->columns,1,exception);
970 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
971 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +0000972 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +0000973 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +0000974 break;
cristybb503372010-05-27 20:51:26 +0000975 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +0000976 {
cristy4c08aed2011-07-01 19:47:50 +0000977 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +0000978 p+=GetPixelChannels(canvas_image);
979 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +0000980 }
981 if (SyncAuthenticPixels(image,exception) == MagickFalse)
982 break;
983 }
cristyb3f97ae2015-05-18 12:29:32 +0000984 pixels=(const unsigned char *) ReadBlobStream(image,length,
985 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +0000986 }
987 if (image->previous == (Image *) NULL)
988 {
989 status=SetImageProgress(image,LoadImageTag,3,5);
990 if (status == MagickFalse)
991 break;
992 }
cristy17f11b02014-12-20 19:37:04 +0000993 if (image->alpha_trait != UndefinedPixelTrait)
cristy3ed852e2009-09-05 21:47:34 +0000994 {
995 (void) CloseBlob(image);
996 AppendImageFormat("A",image->filename);
997 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
998 if (status == MagickFalse)
999 {
1000 canvas_image=DestroyImageList(canvas_image);
1001 image=DestroyImageList(image);
1002 return((Image *) NULL);
1003 }
1004 length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum);
cristybb503372010-05-27 20:51:26 +00001005 for (i=0; i < (ssize_t) scene; i++)
1006 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristybd797f12015-01-24 20:42:32 +00001007 {
cristyb3f97ae2015-05-18 12:29:32 +00001008 pixels=(const unsigned char *) ReadBlobStream(image,length,
cristybd797f12015-01-24 20:42:32 +00001009 GetQuantumPixels(quantum_info),&count);
1010 if (count != (ssize_t) length)
cristy3ed852e2009-09-05 21:47:34 +00001011 {
1012 ThrowFileException(exception,CorruptImageError,
1013 "UnexpectedEndOfFile",image->filename);
1014 break;
1015 }
cristybd797f12015-01-24 20:42:32 +00001016 }
cristyb3f97ae2015-05-18 12:29:32 +00001017 pixels=(const unsigned char *) ReadBlobStream(image,length,
1018 GetQuantumPixels(quantum_info),
cristybd797f12015-01-24 20:42:32 +00001019 &count);
cristybb503372010-05-27 20:51:26 +00001020 for (y=0; y < (ssize_t) image->extract_info.height; y++)
cristy3ed852e2009-09-05 21:47:34 +00001021 {
cristy4c08aed2011-07-01 19:47:50 +00001022 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001023 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001024
cristy4c08aed2011-07-01 19:47:50 +00001025 register Quantum
dirk05d2ff72015-11-18 23:13:43 +01001026 *magick_restrict q;
cristy3ed852e2009-09-05 21:47:34 +00001027
cristy90dbac72010-08-22 15:08:40 +00001028 register ssize_t
1029 x;
1030
cristy21da32d2009-09-12 14:56:09 +00001031 if (count != (ssize_t) length)
1032 {
1033 ThrowFileException(exception,CorruptImageError,
1034 "UnexpectedEndOfFile",image->filename);
1035 break;
1036 }
cristy3ed852e2009-09-05 21:47:34 +00001037 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
1038 exception);
cristyacd2ed22011-08-30 01:44:23 +00001039 if (q == (Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001040 break;
1041 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
1042 quantum_info,YellowQuantum,pixels,exception);
1043 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
1044 break;
1045 if (((y-image->extract_info.y) >= 0) &&
cristybb503372010-05-27 20:51:26 +00001046 ((y-image->extract_info.y) < (ssize_t) image->rows))
cristy3ed852e2009-09-05 21:47:34 +00001047 {
1048 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
1049 0,canvas_image->columns,1,exception);
1050 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
1051 image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001052 if ((p == (const Quantum *) NULL) ||
cristyacd2ed22011-08-30 01:44:23 +00001053 (q == (Quantum *) NULL))
cristy3ed852e2009-09-05 21:47:34 +00001054 break;
cristybb503372010-05-27 20:51:26 +00001055 for (x=0; x < (ssize_t) image->columns; x++)
cristy3ed852e2009-09-05 21:47:34 +00001056 {
cristy4c08aed2011-07-01 19:47:50 +00001057 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
cristyed231572011-07-14 02:18:59 +00001058 p+=GetPixelChannels(canvas_image);
1059 q+=GetPixelChannels(image);
cristy3ed852e2009-09-05 21:47:34 +00001060 }
1061 if (SyncAuthenticPixels(image,exception) == MagickFalse)
1062 break;
1063 }
cristyb3f97ae2015-05-18 12:29:32 +00001064 pixels=(const unsigned char *) ReadBlobStream(image,length,
1065 GetQuantumPixels(quantum_info),&count);
cristy3ed852e2009-09-05 21:47:34 +00001066 }
1067 if (image->previous == (Image *) NULL)
1068 {
1069 status=SetImageProgress(image,LoadImageTag,4,5);
1070 if (status == MagickFalse)
1071 break;
1072 }
1073 }
1074 if (image->previous == (Image *) NULL)
1075 {
1076 status=SetImageProgress(image,LoadImageTag,5,5);
1077 if (status == MagickFalse)
1078 break;
1079 }
1080 break;
1081 }
1082 }
1083 SetQuantumImageType(image,quantum_type);
1084 /*
1085 Proceed to next image.
1086 */
1087 if (image_info->number_scenes != 0)
1088 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
1089 break;
1090 if (count == (ssize_t) length)
1091 {
1092 /*
1093 Allocate next image structure.
1094 */
cristy9950d572011-10-01 18:22:35 +00001095 AcquireNextImage(image_info,image,exception);
cristy3ed852e2009-09-05 21:47:34 +00001096 if (GetNextImageInList(image) == (Image *) NULL)
1097 {
1098 image=DestroyImageList(image);
1099 return((Image *) NULL);
1100 }
1101 image=SyncNextImageInList(image);
1102 status=SetImageProgress(image,LoadImagesTag,TellBlob(image),
1103 GetBlobSize(image));
1104 if (status == MagickFalse)
1105 break;
1106 }
1107 scene++;
1108 } while (count == (ssize_t) length);
cristy3ed852e2009-09-05 21:47:34 +00001109 quantum_info=DestroyQuantumInfo(quantum_info);
cristy3ed852e2009-09-05 21:47:34 +00001110 canvas_image=DestroyImage(canvas_image);
1111 (void) CloseBlob(image);
1112 return(GetFirstImageInList(image));
1113}
1114
1115/*
1116%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1117% %
1118% %
1119% %
1120% R e g i s t e r C M Y K I m a g e %
1121% %
1122% %
1123% %
1124%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1125%
1126% RegisterCMYKImage() adds attributes for the CMYK image format to
1127% the list of supported formats. The attributes include the image format
1128% tag, a method to read and/or write the format, whether the format
1129% supports the saving of more than one frame to the same file or blob,
1130% whether the format supports native in-memory I/O, and a brief
1131% description of the format.
1132%
1133% The format of the RegisterCMYKImage method is:
1134%
cristybb503372010-05-27 20:51:26 +00001135% size_t RegisterCMYKImage(void)
cristy3ed852e2009-09-05 21:47:34 +00001136%
1137*/
cristybb503372010-05-27 20:51:26 +00001138ModuleExport size_t RegisterCMYKImage(void)
cristy3ed852e2009-09-05 21:47:34 +00001139{
1140 MagickInfo
1141 *entry;
1142
dirk06b627a2015-04-06 18:59:17 +00001143 entry=AcquireMagickInfo("CMYK","CMYK",
1144 "Raw cyan, magenta, yellow, and black samples");
cristy3ed852e2009-09-05 21:47:34 +00001145 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1146 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
dirk08e9a112015-02-22 01:51:41 +00001147 entry->flags|=CoderRawSupportFlag;
1148 entry->flags|=CoderEndianSupportFlag;
cristy3ed852e2009-09-05 21:47:34 +00001149 (void) RegisterMagickInfo(entry);
dirk06b627a2015-04-06 18:59:17 +00001150 entry=AcquireMagickInfo("CMYK","CMYKA",
1151 "Raw cyan, magenta, yellow, black, and alpha samples");
cristy3ed852e2009-09-05 21:47:34 +00001152 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1153 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
dirk08e9a112015-02-22 01:51:41 +00001154 entry->flags|=CoderRawSupportFlag;
1155 entry->flags|=CoderEndianSupportFlag;
cristy3ed852e2009-09-05 21:47:34 +00001156 (void) RegisterMagickInfo(entry);
1157 return(MagickImageCoderSignature);
1158}
1159
1160/*
1161%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1162% %
1163% %
1164% %
1165% U n r e g i s t e r C M Y K I m a g e %
1166% %
1167% %
1168% %
1169%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1170%
1171% UnregisterCMYKImage() removes format registrations made by the
1172% CMYK module from the list of supported formats.
1173%
1174% The format of the UnregisterCMYKImage method is:
1175%
1176% UnregisterCMYKImage(void)
1177%
1178*/
1179ModuleExport void UnregisterCMYKImage(void)
1180{
1181 (void) UnregisterMagickInfo("CMYK");
1182 (void) UnregisterMagickInfo("CMYKA");
1183}
1184
1185/*
1186%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1187% %
1188% %
1189% %
1190% W r i t e C M Y K I m a g e %
1191% %
1192% %
1193% %
1194%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1195%
1196% WriteCMYKImage() writes an image to a file in cyan, magenta, yellow, and
1197% black,rasterfile format.
1198%
1199% The format of the WriteCMYKImage method is:
1200%
1201% MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
cristy1e178e72011-08-28 19:44:34 +00001202% Image *image,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +00001203%
1204% A description of each parameter follows.
1205%
1206% o image_info: the image info.
1207%
1208% o image: The image.
1209%
cristy1e178e72011-08-28 19:44:34 +00001210% o exception: return any errors or warnings in this structure.
1211%
cristy3ed852e2009-09-05 21:47:34 +00001212*/
1213static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
cristy1e178e72011-08-28 19:44:34 +00001214 Image *image,ExceptionInfo *exception)
cristy3ed852e2009-09-05 21:47:34 +00001215{
cristy3ed852e2009-09-05 21:47:34 +00001216 MagickBooleanType
1217 status;
1218
1219 MagickOffsetType
1220 scene;
1221
1222 QuantumInfo
1223 *quantum_info;
1224
1225 QuantumType
1226 quantum_type;
1227
cristy1e178e72011-08-28 19:44:34 +00001228 size_t
1229 length;
1230
cristy3ed852e2009-09-05 21:47:34 +00001231 ssize_t
cristy90dbac72010-08-22 15:08:40 +00001232 count,
1233 y;
cristy3ed852e2009-09-05 21:47:34 +00001234
cristy3ed852e2009-09-05 21:47:34 +00001235 unsigned char
1236 *pixels;
1237
1238 /*
1239 Allocate memory for pixels.
1240 */
1241 assert(image_info != (const ImageInfo *) NULL);
cristye1c94d92015-06-28 12:16:33 +00001242 assert(image_info->signature == MagickCoreSignature);
cristy3ed852e2009-09-05 21:47:34 +00001243 assert(image != (Image *) NULL);
cristye1c94d92015-06-28 12:16:33 +00001244 assert(image->signature == MagickCoreSignature);
cristy3ed852e2009-09-05 21:47:34 +00001245 if (image->debug != MagickFalse)
1246 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1247 if (image_info->interlace != PartitionInterlace)
1248 {
1249 /*
1250 Open output image file.
1251 */
cristyedf03fa2011-08-30 12:44:39 +00001252 status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001253 if (status == MagickFalse)
1254 return(status);
1255 }
cristy3ed852e2009-09-05 21:47:34 +00001256 scene=0;
1257 do
1258 {
1259 /*
1260 Convert MIFF to CMYK raster pixels.
1261 */
1262 if (image->colorspace != CMYKColorspace)
cristye941a752011-10-15 01:52:48 +00001263 (void) TransformImageColorspace(image,CMYKColorspace,exception);
cristy286596b2012-01-08 00:58:30 +00001264 quantum_type=CMYKQuantum;
1265 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
1266 {
1267 quantum_type=CMYKAQuantum;
cristy17f11b02014-12-20 19:37:04 +00001268 if (image->alpha_trait == UndefinedPixelTrait)
cristy286596b2012-01-08 00:58:30 +00001269 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel,exception);
1270 }
cristy5f766ef2014-12-14 21:12:47 +00001271 quantum_info=AcquireQuantumInfo(image_info,image);
cristy3ed852e2009-09-05 21:47:34 +00001272 if (quantum_info == (QuantumInfo *) NULL)
1273 ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
cristyb3f97ae2015-05-18 12:29:32 +00001274 pixels=(unsigned char *) GetQuantumPixels(quantum_info);
cristy3ed852e2009-09-05 21:47:34 +00001275 switch (image_info->interlace)
1276 {
1277 case NoInterlace:
1278 default:
1279 {
1280 /*
1281 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
1282 */
cristybb503372010-05-27 20:51:26 +00001283 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001284 {
cristy4c08aed2011-07-01 19:47:50 +00001285 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001286 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001287
cristy1e178e72011-08-28 19:44:34 +00001288 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001289 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001290 break;
cristy4c08aed2011-07-01 19:47:50 +00001291 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001292 quantum_type,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001293 count=WriteBlob(image,length,pixels);
1294 if (count != (ssize_t) length)
1295 break;
1296 if (image->previous == (Image *) NULL)
1297 {
cristycee97112010-05-28 00:44:52 +00001298 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1299 image->rows);
cristy3ed852e2009-09-05 21:47:34 +00001300 if (status == MagickFalse)
1301 break;
1302 }
1303 }
1304 break;
1305 }
1306 case LineInterlace:
1307 {
1308 /*
1309 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
1310 */
cristybb503372010-05-27 20:51:26 +00001311 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001312 {
cristy4c08aed2011-07-01 19:47:50 +00001313 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001314 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001315
cristy1e178e72011-08-28 19:44:34 +00001316 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001317 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001318 break;
cristy4c08aed2011-07-01 19:47:50 +00001319 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001320 CyanQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001321 count=WriteBlob(image,length,pixels);
1322 if (count != (ssize_t) length)
1323 break;
cristy4c08aed2011-07-01 19:47:50 +00001324 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001325 MagentaQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001326 count=WriteBlob(image,length,pixels);
1327 if (count != (ssize_t) length)
1328 break;
cristy4c08aed2011-07-01 19:47:50 +00001329 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001330 YellowQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001331 count=WriteBlob(image,length,pixels);
1332 if (count != (ssize_t) length)
1333 break;
cristy4c08aed2011-07-01 19:47:50 +00001334 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001335 BlackQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001336 count=WriteBlob(image,length,pixels);
1337 if (count != (ssize_t) length)
1338 break;
1339 if (quantum_type == CMYKAQuantum)
1340 {
cristy4c08aed2011-07-01 19:47:50 +00001341 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001342 AlphaQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001343 count=WriteBlob(image,length,pixels);
1344 if (count != (ssize_t) length)
1345 break;
1346 }
1347 if (image->previous == (Image *) NULL)
1348 {
cristycee97112010-05-28 00:44:52 +00001349 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1350 image->rows);
cristy3ed852e2009-09-05 21:47:34 +00001351 if (status == MagickFalse)
1352 break;
1353 }
1354 }
1355 break;
1356 }
1357 case PlaneInterlace:
1358 {
1359 /*
1360 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
1361 */
cristybb503372010-05-27 20:51:26 +00001362 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001363 {
cristy4c08aed2011-07-01 19:47:50 +00001364 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001365 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001366
cristy1e178e72011-08-28 19:44:34 +00001367 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001368 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001369 break;
cristy4c08aed2011-07-01 19:47:50 +00001370 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001371 CyanQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001372 count=WriteBlob(image,length,pixels);
1373 if (count != (ssize_t) length)
1374 break;
1375 }
1376 if (image->previous == (Image *) NULL)
1377 {
1378 status=SetImageProgress(image,SaveImageTag,1,6);
1379 if (status == MagickFalse)
1380 break;
1381 }
cristybb503372010-05-27 20:51:26 +00001382 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001383 {
cristy4c08aed2011-07-01 19:47:50 +00001384 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001385 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001386
cristy1e178e72011-08-28 19:44:34 +00001387 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001388 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001389 break;
cristy4c08aed2011-07-01 19:47:50 +00001390 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001391 MagentaQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001392 count=WriteBlob(image,length,pixels);
1393 if (count != (ssize_t) length)
1394 break;
1395 }
1396 if (image->previous == (Image *) NULL)
1397 {
1398 status=SetImageProgress(image,SaveImageTag,2,6);
1399 if (status == MagickFalse)
1400 break;
1401 }
cristybb503372010-05-27 20:51:26 +00001402 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001403 {
cristy4c08aed2011-07-01 19:47:50 +00001404 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001405 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001406
cristy1e178e72011-08-28 19:44:34 +00001407 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001408 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001409 break;
cristy4c08aed2011-07-01 19:47:50 +00001410 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001411 YellowQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001412 count=WriteBlob(image,length,pixels);
1413 if (count != (ssize_t) length)
1414 break;
1415 }
1416 if (image->previous == (Image *) NULL)
1417 {
1418 status=SetImageProgress(image,SaveImageTag,3,6);
1419 if (status == MagickFalse)
1420 break;
1421 }
cristybb503372010-05-27 20:51:26 +00001422 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001423 {
cristy4c08aed2011-07-01 19:47:50 +00001424 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001425 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001426
cristy1e178e72011-08-28 19:44:34 +00001427 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001428 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001429 break;
cristy4c08aed2011-07-01 19:47:50 +00001430 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001431 BlackQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001432 count=WriteBlob(image,length,pixels);
1433 if (count != (ssize_t) length)
1434 break;
1435 }
1436 if (image->previous == (Image *) NULL)
1437 {
1438 status=SetImageProgress(image,SaveImageTag,4,6);
1439 if (status == MagickFalse)
1440 break;
1441 }
1442 if (quantum_type == CMYKAQuantum)
1443 {
cristybb503372010-05-27 20:51:26 +00001444 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001445 {
cristy4c08aed2011-07-01 19:47:50 +00001446 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001447 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001448
cristy1e178e72011-08-28 19:44:34 +00001449 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001450 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001451 break;
cristy4c08aed2011-07-01 19:47:50 +00001452 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001453 AlphaQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001454 count=WriteBlob(image,length,pixels);
1455 if (count != (ssize_t) length)
1456 break;
1457 }
1458 if (image->previous == (Image *) NULL)
1459 {
1460 status=SetImageProgress(image,SaveImageTag,5,6);
1461 if (status == MagickFalse)
1462 break;
1463 }
1464 }
1465 if (image_info->interlace == PartitionInterlace)
1466 (void) CopyMagickString(image->filename,image_info->filename,
cristy151b66d2015-04-15 10:50:31 +00001467 MagickPathExtent);
cristy3ed852e2009-09-05 21:47:34 +00001468 if (image->previous == (Image *) NULL)
1469 {
1470 status=SetImageProgress(image,SaveImageTag,6,6);
1471 if (status == MagickFalse)
1472 break;
1473 }
1474 break;
1475 }
1476 case PartitionInterlace:
1477 {
1478 /*
1479 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
1480 */
1481 AppendImageFormat("C",image->filename);
1482 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
cristy1e178e72011-08-28 19:44:34 +00001483 AppendBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001484 if (status == MagickFalse)
1485 return(status);
cristybb503372010-05-27 20:51:26 +00001486 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001487 {
cristy4c08aed2011-07-01 19:47:50 +00001488 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001489 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001490
cristy1e178e72011-08-28 19:44:34 +00001491 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001492 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001493 break;
cristy4c08aed2011-07-01 19:47:50 +00001494 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001495 CyanQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001496 count=WriteBlob(image,length,pixels);
1497 if (count != (ssize_t) length)
1498 break;
1499 }
1500 if (image->previous == (Image *) NULL)
1501 {
1502 status=SetImageProgress(image,SaveImageTag,1,6);
1503 if (status == MagickFalse)
1504 break;
1505 }
1506 (void) CloseBlob(image);
1507 AppendImageFormat("M",image->filename);
1508 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
cristy1e178e72011-08-28 19:44:34 +00001509 AppendBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001510 if (status == MagickFalse)
1511 return(status);
cristybb503372010-05-27 20:51:26 +00001512 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001513 {
cristy4c08aed2011-07-01 19:47:50 +00001514 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001515 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001516
cristy1e178e72011-08-28 19:44:34 +00001517 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001518 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001519 break;
cristy4c08aed2011-07-01 19:47:50 +00001520 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001521 MagentaQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001522 count=WriteBlob(image,length,pixels);
1523 if (count != (ssize_t) length)
1524 break;
1525 }
1526 if (image->previous == (Image *) NULL)
1527 {
1528 status=SetImageProgress(image,SaveImageTag,2,6);
1529 if (status == MagickFalse)
1530 break;
1531 }
1532 (void) CloseBlob(image);
1533 AppendImageFormat("Y",image->filename);
1534 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
cristy1e178e72011-08-28 19:44:34 +00001535 AppendBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001536 if (status == MagickFalse)
1537 return(status);
cristybb503372010-05-27 20:51:26 +00001538 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001539 {
cristy4c08aed2011-07-01 19:47:50 +00001540 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001541 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001542
cristy1e178e72011-08-28 19:44:34 +00001543 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001544 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001545 break;
cristy4c08aed2011-07-01 19:47:50 +00001546 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001547 YellowQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001548 count=WriteBlob(image,length,pixels);
1549 if (count != (ssize_t) length)
1550 break;
1551 }
1552 if (image->previous == (Image *) NULL)
1553 {
1554 status=SetImageProgress(image,SaveImageTag,3,6);
1555 if (status == MagickFalse)
1556 break;
1557 }
1558 (void) CloseBlob(image);
1559 AppendImageFormat("K",image->filename);
1560 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
cristy1e178e72011-08-28 19:44:34 +00001561 AppendBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001562 if (status == MagickFalse)
1563 return(status);
cristybb503372010-05-27 20:51:26 +00001564 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001565 {
cristy4c08aed2011-07-01 19:47:50 +00001566 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001567 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001568
cristy1e178e72011-08-28 19:44:34 +00001569 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001570 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001571 break;
cristy4c08aed2011-07-01 19:47:50 +00001572 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001573 BlackQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001574 count=WriteBlob(image,length,pixels);
1575 if (count != (ssize_t) length)
1576 break;
1577 }
1578 if (image->previous == (Image *) NULL)
1579 {
1580 status=SetImageProgress(image,SaveImageTag,4,6);
1581 if (status == MagickFalse)
1582 break;
1583 }
1584 if (quantum_type == CMYKAQuantum)
1585 {
1586 (void) CloseBlob(image);
1587 AppendImageFormat("A",image->filename);
1588 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
cristy1e178e72011-08-28 19:44:34 +00001589 AppendBinaryBlobMode,exception);
cristy3ed852e2009-09-05 21:47:34 +00001590 if (status == MagickFalse)
1591 return(status);
cristybb503372010-05-27 20:51:26 +00001592 for (y=0; y < (ssize_t) image->rows; y++)
cristy3ed852e2009-09-05 21:47:34 +00001593 {
cristy4c08aed2011-07-01 19:47:50 +00001594 register const Quantum
dirk05d2ff72015-11-18 23:13:43 +01001595 *magick_restrict p;
cristy3ed852e2009-09-05 21:47:34 +00001596
cristy1e178e72011-08-28 19:44:34 +00001597 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
cristy4c08aed2011-07-01 19:47:50 +00001598 if (p == (const Quantum *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00001599 break;
cristy4c08aed2011-07-01 19:47:50 +00001600 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
cristy1e178e72011-08-28 19:44:34 +00001601 AlphaQuantum,pixels,exception);
cristy3ed852e2009-09-05 21:47:34 +00001602 count=WriteBlob(image,length,pixels);
1603 if (count != (ssize_t) length)
1604 break;
1605 }
1606 if (image->previous == (Image *) NULL)
1607 {
1608 status=SetImageProgress(image,SaveImageTag,5,6);
1609 if (status == MagickFalse)
1610 break;
1611 }
1612 }
1613 (void) CloseBlob(image);
1614 (void) CopyMagickString(image->filename,image_info->filename,
cristy151b66d2015-04-15 10:50:31 +00001615 MagickPathExtent);
cristy3ed852e2009-09-05 21:47:34 +00001616 if (image->previous == (Image *) NULL)
1617 {
1618 status=SetImageProgress(image,SaveImageTag,6,6);
1619 if (status == MagickFalse)
1620 break;
1621 }
1622 break;
1623 }
1624 }
1625 quantum_info=DestroyQuantumInfo(quantum_info);
1626 if (GetNextImageInList(image) == (Image *) NULL)
1627 break;
1628 image=SyncNextImageInList(image);
1629 status=SetImageProgress(image,SaveImagesTag,scene++,
1630 GetImageListLength(image));
1631 if (status == MagickFalse)
1632 break;
1633 } while (image_info->adjoin != MagickFalse);
1634 (void) CloseBlob(image);
1635 return(MagickTrue);
1636}