2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13 % Read/Write RAW CMYK Image Format %
20 % Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % http://www.imagemagick.org/script/license.php %
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. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 #include "magick/studio.h"
43 #include "magick/blob.h"
44 #include "magick/blob-private.h"
45 #include "magick/cache.h"
46 #include "magick/colorspace.h"
47 #include "magick/constitute.h"
48 #include "magick/exception.h"
49 #include "magick/exception-private.h"
50 #include "magick/image.h"
51 #include "magick/image-private.h"
52 #include "magick/list.h"
53 #include "magick/magick.h"
54 #include "magick/memory_.h"
55 #include "magick/monitor.h"
56 #include "magick/monitor-private.h"
57 #include "magick/pixel-private.h"
58 #include "magick/quantum-private.h"
59 #include "magick/static.h"
60 #include "magick/statistic.h"
61 #include "magick/string_.h"
62 #include "magick/module.h"
63 #include "magick/utility.h"
68 static MagickBooleanType
69 WriteCMYKImage(const ImageInfo *,Image *);
72 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76 % R e a d C M Y K I m a g e %
80 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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.
86 % The format of the ReadCMYKImage method is:
88 % Image *ReadCMYKImage(const ImageInfo *image_info,
89 % ExceptionInfo *exception)
91 % A description of each parameter follows:
93 % o image_info: the image info.
95 % o exception: return any errors or warnings in this structure.
98 static Image *ReadCMYKImage(const ImageInfo *image_info,
99 ExceptionInfo *exception)
135 assert(image_info != (const ImageInfo *) NULL);
136 assert(image_info->signature == MagickSignature);
137 if (image_info->debug != MagickFalse)
138 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
139 image_info->filename);
140 assert(exception != (ExceptionInfo *) NULL);
141 assert(exception->signature == MagickSignature);
142 image=AcquireImage(image_info);
143 if ((image->columns == 0) || (image->rows == 0))
144 ThrowReaderException(OptionError,"MustSpecifyImageSize");
145 image->colorspace=CMYKColorspace;
146 if (image_info->interlace != PartitionInterlace)
148 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
149 if (status == MagickFalse)
151 image=DestroyImageList(image);
152 return((Image *) NULL);
154 for (i=0; i < image->offset; i++)
155 if (ReadBlobByte(image) == EOF)
157 ThrowFileException(exception,CorruptImageError,
158 "UnexpectedEndOfFile",image->filename);
163 Create virtual canvas to support cropping (i.e. image.cmyk[100x100+10+20]).
165 canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse,
167 (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod);
168 quantum_info=AcquireQuantumInfo(image_info,canvas_image);
169 if (quantum_info == (QuantumInfo *) NULL)
170 ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
171 pixels=GetQuantumPixels(quantum_info);
172 quantum_type=CMYKQuantum;
173 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
175 quantum_type=CMYKAQuantum;
176 image->matte=MagickTrue;
178 if (image_info->number_scenes != 0)
179 while (image->scene < image_info->scene)
185 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
186 for (y=0; y < (ssize_t) image->rows; y++)
188 count=ReadBlob(image,length,pixels);
189 if (count != (ssize_t) length)
199 Read pixels to virtual canvas image then push to image.
201 if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0))
202 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
204 image->colorspace=CMYKColorspace;
205 switch (image_info->interlace)
211 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
215 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
216 count=ReadBlob(image,length,pixels);
218 for (y=0; y < (ssize_t) image->extract_info.height; y++)
220 register const IndexPacket
221 *restrict canvas_indexes;
223 register const PixelPacket
235 if (count != (ssize_t) length)
237 ThrowFileException(exception,CorruptImageError,
238 "UnexpectedEndOfFile",image->filename);
241 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
243 if (q == (PixelPacket *) NULL)
245 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
246 quantum_info,quantum_type,pixels,exception);
247 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
249 if (((y-image->extract_info.y) >= 0) &&
250 ((y-image->extract_info.y) < (ssize_t) image->rows))
252 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
253 canvas_image->columns,1,exception);
254 q=QueueAuthenticPixels(image,0,y-image->extract_info.y,
255 image->columns,1,exception);
256 if ((p == (const PixelPacket *) NULL) ||
257 (q == (PixelPacket *) NULL))
259 canvas_indexes=GetVirtualIndexQueue(canvas_image);
260 indexes=GetAuthenticIndexQueue(image);
261 for (x=0; x < (ssize_t) image->columns; x++)
263 SetRedPixelComponent(q,GetRedPixelComponent(p));
264 SetGreenPixelComponent(q,GetGreenPixelComponent(p));
265 SetBluePixelComponent(q,GetBluePixelComponent(p));
266 indexes[x]=canvas_indexes[image->extract_info.x+x];
267 SetOpacityPixelComponent(q,OpaqueOpacity);
268 if (image->matte != MagickFalse)
269 SetOpacityPixelComponent(q,GetOpacityPixelComponent(p));
273 if (SyncAuthenticPixels(image,exception) == MagickFalse)
276 if (image->previous == (Image *) NULL)
278 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
280 if (status == MagickFalse)
283 count=ReadBlob(image,length,pixels);
300 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
304 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
305 count=ReadBlob(image,length,pixels);
307 for (y=0; y < (ssize_t) image->extract_info.height; y++)
309 register const IndexPacket
310 *restrict canvas_indexes;
312 register const PixelPacket
324 if (count != (ssize_t) length)
326 ThrowFileException(exception,CorruptImageError,
327 "UnexpectedEndOfFile",image->filename);
330 for (i=0; i < (image->matte != MagickFalse ? 5 : 4); i++)
332 quantum_type=quantum_types[i];
333 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
335 if (q == (PixelPacket *) NULL)
337 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
338 quantum_info,quantum_type,pixels,exception);
339 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
341 if (((y-image->extract_info.y) >= 0) &&
342 ((y-image->extract_info.y) < (ssize_t) image->rows))
344 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
345 0,canvas_image->columns,1,exception);
346 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
347 image->columns,1,exception);
348 if ((p == (const PixelPacket *) NULL) ||
349 (q == (PixelPacket *) NULL))
351 canvas_indexes=GetVirtualIndexQueue(canvas_image);
352 indexes=GetAuthenticIndexQueue(image);
353 for (x=0; x < (ssize_t) image->columns; x++)
355 switch (quantum_type)
357 case CyanQuantum: SetRedPixelComponent(q,GetRedPixelComponent(p)); break;
358 case MagentaQuantum: SetGreenPixelComponent(q,GetGreenPixelComponent(p)); break;
359 case YellowQuantum: SetBluePixelComponent(q,GetBluePixelComponent(p)); break;
360 case BlackQuantum: indexes[x]=
361 canvas_indexes[image->extract_info.x+x];; break;
362 case OpacityQuantum: SetOpacityPixelComponent(q,GetOpacityPixelComponent(p)); break;
368 if (SyncAuthenticPixels(image,exception) == MagickFalse)
371 count=ReadBlob(image,length,pixels);
373 if (image->previous == (Image *) NULL)
375 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
377 if (status == MagickFalse)
386 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
390 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
391 count=ReadBlob(image,length,pixels);
393 for (y=0; y < (ssize_t) image->extract_info.height; y++)
395 register const PixelPacket
404 if (count != (ssize_t) length)
406 ThrowFileException(exception,CorruptImageError,
407 "UnexpectedEndOfFile",image->filename);
410 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
412 if (q == (PixelPacket *) NULL)
414 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
415 quantum_info,CyanQuantum,pixels,exception);
416 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
418 if (((y-image->extract_info.y) >= 0) &&
419 ((y-image->extract_info.y) < (ssize_t) image->rows))
421 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
422 canvas_image->columns,1,exception);
423 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
424 image->columns,1,exception);
425 if ((p == (const PixelPacket *) NULL) ||
426 (q == (PixelPacket *) NULL))
428 for (x=0; x < (ssize_t) image->columns; x++)
430 SetRedPixelComponent(q,GetRedPixelComponent(p));
434 if (SyncAuthenticPixels(image,exception) == MagickFalse)
437 count=ReadBlob(image,length,pixels);
439 if (image->previous == (Image *) NULL)
441 status=SetImageProgress(image,LoadImageTag,1,6);
442 if (status == MagickFalse)
445 for (y=0; y < (ssize_t) image->extract_info.height; y++)
447 register const PixelPacket
456 if (count != (ssize_t) length)
458 ThrowFileException(exception,CorruptImageError,
459 "UnexpectedEndOfFile",image->filename);
462 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
464 if (q == (PixelPacket *) NULL)
466 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
467 quantum_info,MagentaQuantum,pixels,exception);
468 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
470 if (((y-image->extract_info.y) >= 0) &&
471 ((y-image->extract_info.y) < (ssize_t) image->rows))
473 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
474 canvas_image->columns,1,exception);
475 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
476 image->columns,1,exception);
477 if ((p == (const PixelPacket *) NULL) ||
478 (q == (PixelPacket *) NULL))
480 for (x=0; x < (ssize_t) image->columns; x++)
482 SetGreenPixelComponent(q,GetGreenPixelComponent(p));
486 if (SyncAuthenticPixels(image,exception) == MagickFalse)
489 count=ReadBlob(image,length,pixels);
491 if (image->previous == (Image *) NULL)
493 status=SetImageProgress(image,LoadImageTag,2,6);
494 if (status == MagickFalse)
497 for (y=0; y < (ssize_t) image->extract_info.height; y++)
499 register const PixelPacket
508 if (count != (ssize_t) length)
510 ThrowFileException(exception,CorruptImageError,
511 "UnexpectedEndOfFile",image->filename);
514 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
516 if (q == (PixelPacket *) NULL)
518 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
519 quantum_info,YellowQuantum,pixels,exception);
520 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
522 if (((y-image->extract_info.y) >= 0) &&
523 ((y-image->extract_info.y) < (ssize_t) image->rows))
525 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
526 canvas_image->columns,1,exception);
527 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
528 image->columns,1,exception);
529 if ((p == (const PixelPacket *) NULL) ||
530 (q == (PixelPacket *) NULL))
532 for (x=0; x < (ssize_t) image->columns; x++)
534 SetBluePixelComponent(q,GetBluePixelComponent(p));
538 if (SyncAuthenticPixels(image,exception) == MagickFalse)
541 count=ReadBlob(image,length,pixels);
543 if (image->previous == (Image *) NULL)
545 status=SetImageProgress(image,LoadImageTag,3,6);
546 if (status == MagickFalse)
549 for (y=0; y < (ssize_t) image->extract_info.height; y++)
551 register const IndexPacket
552 *restrict canvas_indexes;
554 register const PixelPacket
566 if (count != (ssize_t) length)
568 ThrowFileException(exception,CorruptImageError,
569 "UnexpectedEndOfFile",image->filename);
572 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
574 if (q == (PixelPacket *) NULL)
576 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
577 quantum_info,BlackQuantum,pixels,exception);
578 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
580 if (((y-image->extract_info.y) >= 0) &&
581 ((y-image->extract_info.y) < (ssize_t) image->rows))
583 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
584 canvas_image->columns,1,exception);
585 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
586 image->columns,1,exception);
587 if ((p == (const PixelPacket *) NULL) ||
588 (q == (PixelPacket *) NULL))
590 canvas_indexes=GetVirtualIndexQueue(canvas_image);
591 indexes=GetAuthenticIndexQueue(image);
592 for (x=0; x < (ssize_t) image->columns; x++)
594 indexes[x]=canvas_indexes[image->extract_info.x+x];
598 if (SyncAuthenticPixels(image,exception) == MagickFalse)
601 count=ReadBlob(image,length,pixels);
603 if (image->previous == (Image *) NULL)
605 status=SetImageProgress(image,LoadImageTag,4,6);
606 if (status == MagickFalse)
609 if (image->matte != MagickFalse)
611 for (y=0; y < (ssize_t) image->extract_info.height; y++)
613 register const PixelPacket
622 if (count != (ssize_t) length)
624 ThrowFileException(exception,CorruptImageError,
625 "UnexpectedEndOfFile",image->filename);
628 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
630 if (q == (PixelPacket *) NULL)
632 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
633 quantum_info,AlphaQuantum,pixels,exception);
634 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
636 if (((y-image->extract_info.y) >= 0) &&
637 ((y-image->extract_info.y) < (ssize_t) image->rows))
639 p=GetVirtualPixels(canvas_image,
640 canvas_image->extract_info.x,0,canvas_image->columns,1,
642 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
643 image->columns,1,exception);
644 if ((p == (const PixelPacket *) NULL) ||
645 (q == (PixelPacket *) NULL))
647 for (x=0; x < (ssize_t) image->columns; x++)
649 SetOpacityPixelComponent(q,GetOpacityPixelComponent(p));
653 if (SyncAuthenticPixels(image,exception) == MagickFalse)
656 count=ReadBlob(image,length,pixels);
658 if (image->previous == (Image *) NULL)
660 status=SetImageProgress(image,LoadImageTag,5,6);
661 if (status == MagickFalse)
665 if (image->previous == (Image *) NULL)
667 status=SetImageProgress(image,LoadImageTag,6,6);
668 if (status == MagickFalse)
673 case PartitionInterlace:
676 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
678 AppendImageFormat("C",image->filename);
679 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
680 if (status == MagickFalse)
682 canvas_image=DestroyImageList(canvas_image);
683 image=DestroyImageList(image);
684 return((Image *) NULL);
686 for (i=0; i < image->offset; i++)
687 if (ReadBlobByte(image) == EOF)
689 ThrowFileException(exception,CorruptImageError,
690 "UnexpectedEndOfFile",image->filename);
693 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
694 for (i=0; i < (ssize_t) scene; i++)
695 for (y=0; y < (ssize_t) image->extract_info.height; y++)
696 if (ReadBlob(image,length,pixels) != (ssize_t) length)
698 ThrowFileException(exception,CorruptImageError,
699 "UnexpectedEndOfFile",image->filename);
702 count=ReadBlob(image,length,pixels);
703 for (y=0; y < (ssize_t) image->extract_info.height; y++)
705 register const PixelPacket
714 if (count != (ssize_t) length)
716 ThrowFileException(exception,CorruptImageError,
717 "UnexpectedEndOfFile",image->filename);
720 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
722 if (q == (PixelPacket *) NULL)
724 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
725 quantum_info,CyanQuantum,pixels,exception);
726 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
728 if (((y-image->extract_info.y) >= 0) &&
729 ((y-image->extract_info.y) < (ssize_t) image->rows))
731 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
732 canvas_image->columns,1,exception);
733 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
734 image->columns,1,exception);
735 if ((p == (const PixelPacket *) NULL) ||
736 (q == (PixelPacket *) NULL))
738 for (x=0; x < (ssize_t) image->columns; x++)
740 SetRedPixelComponent(q,GetRedPixelComponent(p));
744 if (SyncAuthenticPixels(image,exception) == MagickFalse)
747 count=ReadBlob(image,length,pixels);
749 if (image->previous == (Image *) NULL)
751 status=SetImageProgress(image,LoadImageTag,1,5);
752 if (status == MagickFalse)
755 (void) CloseBlob(image);
756 AppendImageFormat("M",image->filename);
757 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
758 if (status == MagickFalse)
760 canvas_image=DestroyImageList(canvas_image);
761 image=DestroyImageList(image);
762 return((Image *) NULL);
764 length=GetQuantumExtent(canvas_image,quantum_info,MagentaQuantum);
765 for (i=0; i < (ssize_t) scene; i++)
766 for (y=0; y < (ssize_t) image->extract_info.height; y++)
767 if (ReadBlob(image,length,pixels) != (ssize_t) length)
769 ThrowFileException(exception,CorruptImageError,
770 "UnexpectedEndOfFile",image->filename);
773 count=ReadBlob(image,length,pixels);
774 for (y=0; y < (ssize_t) image->extract_info.height; y++)
776 register const PixelPacket
785 if (count != (ssize_t) length)
787 ThrowFileException(exception,CorruptImageError,
788 "UnexpectedEndOfFile",image->filename);
791 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
793 if (q == (PixelPacket *) NULL)
795 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
796 quantum_info,MagentaQuantum,pixels,exception);
797 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
799 if (((y-image->extract_info.y) >= 0) &&
800 ((y-image->extract_info.y) < (ssize_t) image->rows))
802 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
803 canvas_image->columns,1,exception);
804 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
805 image->columns,1,exception);
806 if ((p == (const PixelPacket *) NULL) ||
807 (q == (PixelPacket *) NULL))
809 for (x=0; x < (ssize_t) image->columns; x++)
811 SetGreenPixelComponent(q,GetGreenPixelComponent(p));
815 if (SyncAuthenticPixels(image,exception) == MagickFalse)
818 count=ReadBlob(image,length,pixels);
820 if (image->previous == (Image *) NULL)
822 status=SetImageProgress(image,LoadImageTag,2,5);
823 if (status == MagickFalse)
826 (void) CloseBlob(image);
827 AppendImageFormat("Y",image->filename);
828 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
829 if (status == MagickFalse)
831 canvas_image=DestroyImageList(canvas_image);
832 image=DestroyImageList(image);
833 return((Image *) NULL);
835 length=GetQuantumExtent(canvas_image,quantum_info,YellowQuantum);
836 for (i=0; i < (ssize_t) scene; i++)
837 for (y=0; y < (ssize_t) image->extract_info.height; y++)
838 if (ReadBlob(image,length,pixels) != (ssize_t) length)
840 ThrowFileException(exception,CorruptImageError,
841 "UnexpectedEndOfFile",image->filename);
844 count=ReadBlob(image,length,pixels);
845 for (y=0; y < (ssize_t) image->extract_info.height; y++)
847 register const PixelPacket
856 if (count != (ssize_t) length)
858 ThrowFileException(exception,CorruptImageError,
859 "UnexpectedEndOfFile",image->filename);
862 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
864 if (q == (PixelPacket *) NULL)
866 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
867 quantum_info,YellowQuantum,pixels,exception);
868 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
870 if (((y-image->extract_info.y) >= 0) &&
871 ((y-image->extract_info.y) < (ssize_t) image->rows))
873 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
874 canvas_image->columns,1,exception);
875 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
876 image->columns,1,exception);
877 if ((p == (const PixelPacket *) NULL) ||
878 (q == (PixelPacket *) NULL))
880 for (x=0; x < (ssize_t) image->columns; x++)
882 SetBluePixelComponent(q,GetBluePixelComponent(p));
886 if (SyncAuthenticPixels(image,exception) == MagickFalse)
889 count=ReadBlob(image,length,pixels);
891 if (image->previous == (Image *) NULL)
893 status=SetImageProgress(image,LoadImageTag,3,5);
894 if (status == MagickFalse)
897 (void) CloseBlob(image);
898 AppendImageFormat("K",image->filename);
899 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
900 if (status == MagickFalse)
902 canvas_image=DestroyImageList(canvas_image);
903 image=DestroyImageList(image);
904 return((Image *) NULL);
906 length=GetQuantumExtent(canvas_image,quantum_info,BlackQuantum);
907 for (i=0; i < (ssize_t) scene; i++)
908 for (y=0; y < (ssize_t) image->extract_info.height; y++)
909 if (ReadBlob(image,length,pixels) != (ssize_t) length)
911 ThrowFileException(exception,CorruptImageError,
912 "UnexpectedEndOfFile",image->filename);
915 count=ReadBlob(image,length,pixels);
916 for (y=0; y < (ssize_t) image->extract_info.height; y++)
918 register const IndexPacket
919 *restrict canvas_indexes;
921 register const PixelPacket
933 if (count != (ssize_t) length)
935 ThrowFileException(exception,CorruptImageError,
936 "UnexpectedEndOfFile",image->filename);
939 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
941 if (q == (PixelPacket *) NULL)
943 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
944 quantum_info,BlackQuantum,pixels,exception);
945 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
947 if (((y-image->extract_info.y) >= 0) &&
948 ((y-image->extract_info.y) < (ssize_t) image->rows))
950 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
951 canvas_image->columns,1,exception);
952 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
953 image->columns,1,exception);
954 if ((p == (const PixelPacket *) NULL) ||
955 (q == (PixelPacket *) NULL))
957 canvas_indexes=GetVirtualIndexQueue(canvas_image);
958 indexes=GetAuthenticIndexQueue(image);
959 for (x=0; x < (ssize_t) image->columns; x++)
961 indexes[x]=canvas_indexes[image->extract_info.x+x];
965 if (SyncAuthenticPixels(image,exception) == MagickFalse)
968 count=ReadBlob(image,length,pixels);
970 if (image->previous == (Image *) NULL)
972 status=SetImageProgress(image,LoadImageTag,3,5);
973 if (status == MagickFalse)
976 if (image->matte != MagickFalse)
978 (void) CloseBlob(image);
979 AppendImageFormat("A",image->filename);
980 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
981 if (status == MagickFalse)
983 canvas_image=DestroyImageList(canvas_image);
984 image=DestroyImageList(image);
985 return((Image *) NULL);
987 length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum);
988 for (i=0; i < (ssize_t) scene; i++)
989 for (y=0; y < (ssize_t) image->extract_info.height; y++)
990 if (ReadBlob(image,length,pixels) != (ssize_t) length)
992 ThrowFileException(exception,CorruptImageError,
993 "UnexpectedEndOfFile",image->filename);
996 count=ReadBlob(image,length,pixels);
997 for (y=0; y < (ssize_t) image->extract_info.height; y++)
999 register const PixelPacket
1005 register PixelPacket
1008 if (count != (ssize_t) length)
1010 ThrowFileException(exception,CorruptImageError,
1011 "UnexpectedEndOfFile",image->filename);
1014 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
1016 if (q == (PixelPacket *) NULL)
1018 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
1019 quantum_info,YellowQuantum,pixels,exception);
1020 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
1022 if (((y-image->extract_info.y) >= 0) &&
1023 ((y-image->extract_info.y) < (ssize_t) image->rows))
1025 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
1026 0,canvas_image->columns,1,exception);
1027 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
1028 image->columns,1,exception);
1029 if ((p == (const PixelPacket *) NULL) ||
1030 (q == (PixelPacket *) NULL))
1032 for (x=0; x < (ssize_t) image->columns; x++)
1034 SetOpacityPixelComponent(q,GetOpacityPixelComponent(p));
1038 if (SyncAuthenticPixels(image,exception) == MagickFalse)
1041 count=ReadBlob(image,length,pixels);
1043 if (image->previous == (Image *) NULL)
1045 status=SetImageProgress(image,LoadImageTag,4,5);
1046 if (status == MagickFalse)
1050 if (image->previous == (Image *) NULL)
1052 status=SetImageProgress(image,LoadImageTag,5,5);
1053 if (status == MagickFalse)
1059 SetQuantumImageType(image,quantum_type);
1061 Proceed to next image.
1063 if (image_info->number_scenes != 0)
1064 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
1066 if (count == (ssize_t) length)
1069 Allocate next image structure.
1071 AcquireNextImage(image_info,image);
1072 if (GetNextImageInList(image) == (Image *) NULL)
1074 image=DestroyImageList(image);
1075 return((Image *) NULL);
1077 image=SyncNextImageInList(image);
1078 status=SetImageProgress(image,LoadImagesTag,TellBlob(image),
1079 GetBlobSize(image));
1080 if (status == MagickFalse)
1084 } while (count == (ssize_t) length);
1085 quantum_info=DestroyQuantumInfo(quantum_info);
1086 InheritException(&image->exception,&canvas_image->exception);
1087 canvas_image=DestroyImage(canvas_image);
1088 (void) CloseBlob(image);
1089 return(GetFirstImageInList(image));
1093 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1097 % R e g i s t e r C M Y K I m a g e %
1101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1103 % RegisterCMYKImage() adds attributes for the CMYK image format to
1104 % the list of supported formats. The attributes include the image format
1105 % tag, a method to read and/or write the format, whether the format
1106 % supports the saving of more than one frame to the same file or blob,
1107 % whether the format supports native in-memory I/O, and a brief
1108 % description of the format.
1110 % The format of the RegisterCMYKImage method is:
1112 % size_t RegisterCMYKImage(void)
1115 ModuleExport size_t RegisterCMYKImage(void)
1120 entry=SetMagickInfo("CMYK");
1121 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1122 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
1123 entry->raw=MagickTrue;
1124 entry->endian_support=MagickTrue;
1125 entry->format_type=ExplicitFormatType;
1126 entry->description=ConstantString("Raw cyan, magenta, yellow, and black "
1128 entry->module=ConstantString("CMYK");
1129 (void) RegisterMagickInfo(entry);
1130 entry=SetMagickInfo("CMYKA");
1131 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1132 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
1133 entry->raw=MagickTrue;
1134 entry->endian_support=MagickTrue;
1135 entry->format_type=ExplicitFormatType;
1136 entry->description=ConstantString("Raw cyan, magenta, yellow, black, and "
1138 entry->module=ConstantString("CMYK");
1139 (void) RegisterMagickInfo(entry);
1140 return(MagickImageCoderSignature);
1144 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1148 % U n r e g i s t e r C M Y K I m a g e %
1152 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1154 % UnregisterCMYKImage() removes format registrations made by the
1155 % CMYK module from the list of supported formats.
1157 % The format of the UnregisterCMYKImage method is:
1159 % UnregisterCMYKImage(void)
1162 ModuleExport void UnregisterCMYKImage(void)
1164 (void) UnregisterMagickInfo("CMYK");
1165 (void) UnregisterMagickInfo("CMYKA");
1169 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1173 % W r i t e C M Y K I m a g e %
1177 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1179 % WriteCMYKImage() writes an image to a file in cyan, magenta, yellow, and
1180 % black,rasterfile format.
1182 % The format of the WriteCMYKImage method is:
1184 % MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
1187 % A description of each parameter follows.
1189 % o image_info: the image info.
1191 % o image: The image.
1194 static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
1222 Allocate memory for pixels.
1224 assert(image_info != (const ImageInfo *) NULL);
1225 assert(image_info->signature == MagickSignature);
1226 assert(image != (Image *) NULL);
1227 assert(image->signature == MagickSignature);
1228 if (image->debug != MagickFalse)
1229 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1230 if (image_info->interlace != PartitionInterlace)
1233 Open output image file.
1235 status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
1236 if (status == MagickFalse)
1239 quantum_type=CMYKQuantum;
1240 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
1242 quantum_type=CMYKAQuantum;
1243 image->matte=MagickTrue;
1249 Convert MIFF to CMYK raster pixels.
1251 if (image->colorspace != CMYKColorspace)
1252 (void) TransformImageColorspace(image,CMYKColorspace);
1253 if ((LocaleCompare(image_info->magick,"CMYKA") == 0) &&
1254 (image->matte == MagickFalse))
1255 (void) SetImageAlphaChannel(image,ResetAlphaChannel);
1256 quantum_info=AcquireQuantumInfo(image_info,image);
1257 if (quantum_info == (QuantumInfo *) NULL)
1258 ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
1259 pixels=GetQuantumPixels(quantum_info);
1260 switch (image_info->interlace)
1266 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
1268 for (y=0; y < (ssize_t) image->rows; y++)
1270 register const PixelPacket
1273 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1274 if (p == (const PixelPacket *) NULL)
1276 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1277 quantum_type,pixels,&image->exception);
1278 count=WriteBlob(image,length,pixels);
1279 if (count != (ssize_t) length)
1281 if (image->previous == (Image *) NULL)
1283 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1285 if (status == MagickFalse)
1294 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
1296 for (y=0; y < (ssize_t) image->rows; y++)
1298 register const PixelPacket
1301 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1302 if (p == (const PixelPacket *) NULL)
1304 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1305 CyanQuantum,pixels,&image->exception);
1306 count=WriteBlob(image,length,pixels);
1307 if (count != (ssize_t) length)
1309 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1310 MagentaQuantum,pixels,&image->exception);
1311 count=WriteBlob(image,length,pixels);
1312 if (count != (ssize_t) length)
1314 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1315 YellowQuantum,pixels,&image->exception);
1316 count=WriteBlob(image,length,pixels);
1317 if (count != (ssize_t) length)
1319 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1320 BlackQuantum,pixels,&image->exception);
1321 count=WriteBlob(image,length,pixels);
1322 if (count != (ssize_t) length)
1324 if (quantum_type == CMYKAQuantum)
1326 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1327 quantum_info,AlphaQuantum,pixels,&image->exception);
1328 count=WriteBlob(image,length,pixels);
1329 if (count != (ssize_t) length)
1332 if (image->previous == (Image *) NULL)
1334 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1336 if (status == MagickFalse)
1342 case PlaneInterlace:
1345 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
1347 for (y=0; y < (ssize_t) image->rows; y++)
1349 register const PixelPacket
1352 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1353 if (p == (const PixelPacket *) NULL)
1355 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1356 CyanQuantum,pixels,&image->exception);
1357 count=WriteBlob(image,length,pixels);
1358 if (count != (ssize_t) length)
1361 if (image->previous == (Image *) NULL)
1363 status=SetImageProgress(image,SaveImageTag,1,6);
1364 if (status == MagickFalse)
1367 for (y=0; y < (ssize_t) image->rows; y++)
1369 register const PixelPacket
1372 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1373 if (p == (const PixelPacket *) NULL)
1375 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1376 MagentaQuantum,pixels,&image->exception);
1377 count=WriteBlob(image,length,pixels);
1378 if (count != (ssize_t) length)
1381 if (image->previous == (Image *) NULL)
1383 status=SetImageProgress(image,SaveImageTag,2,6);
1384 if (status == MagickFalse)
1387 for (y=0; y < (ssize_t) image->rows; y++)
1389 register const PixelPacket
1392 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1393 if (p == (const PixelPacket *) NULL)
1395 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1396 YellowQuantum,pixels,&image->exception);
1397 count=WriteBlob(image,length,pixels);
1398 if (count != (ssize_t) length)
1401 if (image->previous == (Image *) NULL)
1403 status=SetImageProgress(image,SaveImageTag,3,6);
1404 if (status == MagickFalse)
1407 for (y=0; y < (ssize_t) image->rows; y++)
1409 register const PixelPacket
1412 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1413 if (p == (const PixelPacket *) NULL)
1415 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1416 BlackQuantum,pixels,&image->exception);
1417 count=WriteBlob(image,length,pixels);
1418 if (count != (ssize_t) length)
1421 if (image->previous == (Image *) NULL)
1423 status=SetImageProgress(image,SaveImageTag,4,6);
1424 if (status == MagickFalse)
1427 if (quantum_type == CMYKAQuantum)
1429 for (y=0; y < (ssize_t) image->rows; y++)
1431 register const PixelPacket
1434 p=GetVirtualPixels(image,0,y,image->columns,1,
1436 if (p == (const PixelPacket *) NULL)
1438 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1439 quantum_info,AlphaQuantum,pixels,&image->exception);
1440 count=WriteBlob(image,length,pixels);
1441 if (count != (ssize_t) length)
1444 if (image->previous == (Image *) NULL)
1446 status=SetImageProgress(image,SaveImageTag,5,6);
1447 if (status == MagickFalse)
1451 if (image_info->interlace == PartitionInterlace)
1452 (void) CopyMagickString(image->filename,image_info->filename,
1454 if (image->previous == (Image *) NULL)
1456 status=SetImageProgress(image,SaveImageTag,6,6);
1457 if (status == MagickFalse)
1462 case PartitionInterlace:
1465 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
1467 AppendImageFormat("C",image->filename);
1468 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1469 AppendBinaryBlobMode,&image->exception);
1470 if (status == MagickFalse)
1472 for (y=0; y < (ssize_t) image->rows; y++)
1474 register const PixelPacket
1477 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1478 if (p == (const PixelPacket *) NULL)
1480 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1481 CyanQuantum,pixels,&image->exception);
1482 count=WriteBlob(image,length,pixels);
1483 if (count != (ssize_t) length)
1486 if (image->previous == (Image *) NULL)
1488 status=SetImageProgress(image,SaveImageTag,1,6);
1489 if (status == MagickFalse)
1492 (void) CloseBlob(image);
1493 AppendImageFormat("M",image->filename);
1494 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1495 AppendBinaryBlobMode,&image->exception);
1496 if (status == MagickFalse)
1498 for (y=0; y < (ssize_t) image->rows; y++)
1500 register const PixelPacket
1503 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1504 if (p == (const PixelPacket *) NULL)
1506 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1507 MagentaQuantum,pixels,&image->exception);
1508 count=WriteBlob(image,length,pixels);
1509 if (count != (ssize_t) length)
1512 if (image->previous == (Image *) NULL)
1514 status=SetImageProgress(image,SaveImageTag,2,6);
1515 if (status == MagickFalse)
1518 (void) CloseBlob(image);
1519 AppendImageFormat("Y",image->filename);
1520 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1521 AppendBinaryBlobMode,&image->exception);
1522 if (status == MagickFalse)
1524 for (y=0; y < (ssize_t) image->rows; y++)
1526 register const PixelPacket
1529 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1530 if (p == (const PixelPacket *) NULL)
1532 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1533 YellowQuantum,pixels,&image->exception);
1534 count=WriteBlob(image,length,pixels);
1535 if (count != (ssize_t) length)
1538 if (image->previous == (Image *) NULL)
1540 status=SetImageProgress(image,SaveImageTag,3,6);
1541 if (status == MagickFalse)
1544 (void) CloseBlob(image);
1545 AppendImageFormat("K",image->filename);
1546 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1547 AppendBinaryBlobMode,&image->exception);
1548 if (status == MagickFalse)
1550 for (y=0; y < (ssize_t) image->rows; y++)
1552 register const PixelPacket
1555 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1556 if (p == (const PixelPacket *) NULL)
1558 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
1559 BlackQuantum,pixels,&image->exception);
1560 count=WriteBlob(image,length,pixels);
1561 if (count != (ssize_t) length)
1564 if (image->previous == (Image *) NULL)
1566 status=SetImageProgress(image,SaveImageTag,4,6);
1567 if (status == MagickFalse)
1570 if (quantum_type == CMYKAQuantum)
1572 (void) CloseBlob(image);
1573 AppendImageFormat("A",image->filename);
1574 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1575 AppendBinaryBlobMode,&image->exception);
1576 if (status == MagickFalse)
1578 for (y=0; y < (ssize_t) image->rows; y++)
1580 register const PixelPacket
1583 p=GetVirtualPixels(image,0,y,image->columns,1,
1585 if (p == (const PixelPacket *) NULL)
1587 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1588 quantum_info,AlphaQuantum,pixels,&image->exception);
1589 count=WriteBlob(image,length,pixels);
1590 if (count != (ssize_t) length)
1593 if (image->previous == (Image *) NULL)
1595 status=SetImageProgress(image,SaveImageTag,5,6);
1596 if (status == MagickFalse)
1600 (void) CloseBlob(image);
1601 (void) CopyMagickString(image->filename,image_info->filename,
1603 if (image->previous == (Image *) NULL)
1605 status=SetImageProgress(image,SaveImageTag,6,6);
1606 if (status == MagickFalse)
1612 quantum_info=DestroyQuantumInfo(quantum_info);
1613 if (GetNextImageInList(image) == (Image *) NULL)
1615 image=SyncNextImageInList(image);
1616 status=SetImageProgress(image,SaveImagesTag,scene++,
1617 GetImageListLength(image));
1618 if (status == MagickFalse)
1620 } while (image_info->adjoin != MagickFalse);
1621 (void) CloseBlob(image);