2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13 % Read/Write RAW CMYK Image Format %
20 % Copyright 1999-2015 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 "MagickCore/studio.h"
43 #include "MagickCore/blob.h"
44 #include "MagickCore/blob-private.h"
45 #include "MagickCore/cache.h"
46 #include "MagickCore/channel.h"
47 #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"
69 static MagickBooleanType
70 WriteCMYKImage(const ImageInfo *,Image *,ExceptionInfo *);
73 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
77 % R e a d C M Y K I m a g e %
81 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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.
87 % The format of the ReadCMYKImage method is:
89 % Image *ReadCMYKImage(const ImageInfo *image_info,
90 % ExceptionInfo *exception)
92 % A description of each parameter follows:
94 % o image_info: the image info.
96 % o exception: return any errors or warnings in this structure.
99 static Image *ReadCMYKImage(const ImageInfo *image_info,
100 ExceptionInfo *exception)
134 assert(image_info != (const ImageInfo *) NULL);
135 assert(image_info->signature == MagickSignature);
136 if (image_info->debug != MagickFalse)
137 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
138 image_info->filename);
139 assert(exception != (ExceptionInfo *) NULL);
140 assert(exception->signature == MagickSignature);
141 image=AcquireImage(image_info,exception);
142 if ((image->columns == 0) || (image->rows == 0))
143 ThrowReaderException(OptionError,"MustSpecifyImageSize");
144 SetImageColorspace(image,CMYKColorspace,exception);
145 if (image_info->interlace != PartitionInterlace)
147 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
148 if (status == MagickFalse)
150 image=DestroyImageList(image);
151 return((Image *) NULL);
153 if (DiscardBlobBytes(image,image->offset) == MagickFalse)
154 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
158 Create virtual canvas to support cropping (i.e. image.cmyk[100x100+10+20]).
160 canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse,
162 (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod,
164 quantum_info=AcquireQuantumInfo(image_info,canvas_image);
165 if (quantum_info == (QuantumInfo *) NULL)
166 ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
167 quantum_type=CMYKQuantum;
168 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
170 quantum_type=CMYKAQuantum;
171 image->alpha_trait=BlendPixelTrait;
173 pixels=(const void *) NULL;
174 if (image_info->number_scenes != 0)
175 while (image->scene < image_info->scene)
181 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
182 for (y=0; y < (ssize_t) image->rows; y++)
184 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
186 if (count != (ssize_t) length)
196 Read pixels to virtual canvas image then push to image.
198 if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0))
199 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
201 status=SetImageExtent(image,image->columns,image->rows,exception);
202 if (status == MagickFalse)
203 return(DestroyImageList(image));
204 SetImageColorspace(image,CMYKColorspace,exception);
205 switch (image_info->interlace)
211 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
215 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
216 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
219 for (y=0; y < (ssize_t) image->extract_info.height; y++)
221 register const Quantum
230 if (count != (ssize_t) length)
232 ThrowFileException(exception,CorruptImageError,
233 "UnexpectedEndOfFile",image->filename);
236 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
238 if (q == (Quantum *) NULL)
240 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
241 quantum_info,quantum_type,pixels,exception);
242 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
244 if (((y-image->extract_info.y) >= 0) &&
245 ((y-image->extract_info.y) < (ssize_t) image->rows))
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);
251 if ((p == (const Quantum *) NULL) ||
252 (q == (Quantum *) NULL))
254 for (x=0; x < (ssize_t) image->columns; x++)
256 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);
261 if (image->alpha_trait != UndefinedPixelTrait)
262 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
263 p+=GetPixelChannels(canvas_image);
264 q+=GetPixelChannels(image);
266 if (SyncAuthenticPixels(image,exception) == MagickFalse)
269 if (image->previous == (Image *) NULL)
271 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
273 if (status == MagickFalse)
276 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
294 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
298 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
299 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
302 for (y=0; y < (ssize_t) image->extract_info.height; y++)
304 register const Quantum
313 if (count != (ssize_t) length)
315 ThrowFileException(exception,CorruptImageError,
316 "UnexpectedEndOfFile",image->filename);
319 for (i=0; i < (image->alpha_trait != UndefinedPixelTrait ? 5 : 4); i++)
321 quantum_type=quantum_types[i];
322 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
324 if (q == (Quantum *) NULL)
326 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
327 quantum_info,quantum_type,pixels,exception);
328 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
330 if (((y-image->extract_info.y) >= 0) &&
331 ((y-image->extract_info.y) < (ssize_t) image->rows))
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);
337 if ((p == (const Quantum *) NULL) ||
338 (q == (Quantum *) NULL))
340 for (x=0; x < (ssize_t) image->columns; x++)
342 switch (quantum_type)
346 SetPixelCyan(image,GetPixelCyan(canvas_image,p),q);
351 SetPixelMagenta(image,GetPixelMagenta(canvas_image,p),q);
356 SetPixelYellow(image,GetPixelYellow(canvas_image,p),q);
361 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
366 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
372 p+=GetPixelChannels(canvas_image);
373 q+=GetPixelChannels(image);
375 if (SyncAuthenticPixels(image,exception) == MagickFalse)
378 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
381 if (image->previous == (Image *) NULL)
383 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
385 if (status == MagickFalse)
394 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
398 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
399 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
402 for (y=0; y < (ssize_t) image->extract_info.height; y++)
404 register const Quantum
413 if (count != (ssize_t) length)
415 ThrowFileException(exception,CorruptImageError,
416 "UnexpectedEndOfFile",image->filename);
419 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
421 if (q == (Quantum *) NULL)
423 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
424 quantum_info,CyanQuantum,pixels,exception);
425 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
427 if (((y-image->extract_info.y) >= 0) &&
428 ((y-image->extract_info.y) < (ssize_t) image->rows))
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);
434 if ((p == (const Quantum *) NULL) ||
435 (q == (Quantum *) NULL))
437 for (x=0; x < (ssize_t) image->columns; x++)
439 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
440 p+=GetPixelChannels(canvas_image);
441 q+=GetPixelChannels(image);
443 if (SyncAuthenticPixels(image,exception) == MagickFalse)
446 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
449 if (image->previous == (Image *) NULL)
451 status=SetImageProgress(image,LoadImageTag,1,6);
452 if (status == MagickFalse)
455 for (y=0; y < (ssize_t) image->extract_info.height; y++)
457 register const Quantum
466 if (count != (ssize_t) length)
468 ThrowFileException(exception,CorruptImageError,
469 "UnexpectedEndOfFile",image->filename);
472 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
474 if (q == (Quantum *) NULL)
476 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
477 quantum_info,MagentaQuantum,pixels,exception);
478 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
480 if (((y-image->extract_info.y) >= 0) &&
481 ((y-image->extract_info.y) < (ssize_t) image->rows))
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);
487 if ((p == (const Quantum *) NULL) ||
488 (q == (Quantum *) NULL))
490 for (x=0; x < (ssize_t) image->columns; x++)
492 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
493 p+=GetPixelChannels(canvas_image);
494 q+=GetPixelChannels(image);
496 if (SyncAuthenticPixels(image,exception) == MagickFalse)
499 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
502 if (image->previous == (Image *) NULL)
504 status=SetImageProgress(image,LoadImageTag,2,6);
505 if (status == MagickFalse)
508 for (y=0; y < (ssize_t) image->extract_info.height; y++)
510 register const Quantum
519 if (count != (ssize_t) length)
521 ThrowFileException(exception,CorruptImageError,
522 "UnexpectedEndOfFile",image->filename);
525 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
527 if (q == (Quantum *) NULL)
529 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
530 quantum_info,YellowQuantum,pixels,exception);
531 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
533 if (((y-image->extract_info.y) >= 0) &&
534 ((y-image->extract_info.y) < (ssize_t) image->rows))
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);
540 if ((p == (const Quantum *) NULL) ||
541 (q == (Quantum *) NULL))
543 for (x=0; x < (ssize_t) image->columns; x++)
545 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
546 p+=GetPixelChannels(canvas_image);
547 q+=GetPixelChannels(image);
549 if (SyncAuthenticPixels(image,exception) == MagickFalse)
552 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
555 if (image->previous == (Image *) NULL)
557 status=SetImageProgress(image,LoadImageTag,3,6);
558 if (status == MagickFalse)
561 for (y=0; y < (ssize_t) image->extract_info.height; y++)
563 register const Quantum
572 if (count != (ssize_t) length)
574 ThrowFileException(exception,CorruptImageError,
575 "UnexpectedEndOfFile",image->filename);
578 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
580 if (q == (Quantum *) NULL)
582 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
583 quantum_info,BlackQuantum,pixels,exception);
584 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
586 if (((y-image->extract_info.y) >= 0) &&
587 ((y-image->extract_info.y) < (ssize_t) image->rows))
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);
593 if ((p == (const Quantum *) NULL) ||
594 (q == (Quantum *) NULL))
596 for (x=0; x < (ssize_t) image->columns; x++)
598 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
599 p+=GetPixelChannels(canvas_image);
600 q+=GetPixelChannels(image);
602 if (SyncAuthenticPixels(image,exception) == MagickFalse)
605 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
608 if (image->previous == (Image *) NULL)
610 status=SetImageProgress(image,LoadImageTag,4,6);
611 if (status == MagickFalse)
614 if (image->alpha_trait != UndefinedPixelTrait)
616 for (y=0; y < (ssize_t) image->extract_info.height; y++)
618 register const Quantum
627 if (count != (ssize_t) length)
629 ThrowFileException(exception,CorruptImageError,
630 "UnexpectedEndOfFile",image->filename);
633 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
635 if (q == (Quantum *) NULL)
637 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
638 quantum_info,AlphaQuantum,pixels,exception);
639 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
641 if (((y-image->extract_info.y) >= 0) &&
642 ((y-image->extract_info.y) < (ssize_t) image->rows))
644 p=GetVirtualPixels(canvas_image,
645 canvas_image->extract_info.x,0,canvas_image->columns,1,
647 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
648 image->columns,1,exception);
649 if ((p == (const Quantum *) NULL) ||
650 (q == (Quantum *) NULL))
652 for (x=0; x < (ssize_t) image->columns; x++)
654 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
655 p+=GetPixelChannels(canvas_image);
656 q+=GetPixelChannels(image);
658 if (SyncAuthenticPixels(image,exception) == MagickFalse)
661 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
664 if (image->previous == (Image *) NULL)
666 status=SetImageProgress(image,LoadImageTag,5,6);
667 if (status == MagickFalse)
671 if (image->previous == (Image *) NULL)
673 status=SetImageProgress(image,LoadImageTag,6,6);
674 if (status == MagickFalse)
679 case PartitionInterlace:
682 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
684 AppendImageFormat("C",image->filename);
685 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
686 if (status == MagickFalse)
688 canvas_image=DestroyImageList(canvas_image);
689 image=DestroyImageList(image);
690 return((Image *) NULL);
692 if (DiscardBlobBytes(image,image->offset) == MagickFalse)
693 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
695 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
696 for (i=0; i < (ssize_t) scene; i++)
697 for (y=0; y < (ssize_t) image->extract_info.height; y++)
699 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
701 if (count != (ssize_t) length)
703 ThrowFileException(exception,CorruptImageError,
704 "UnexpectedEndOfFile",image->filename);
708 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
710 for (y=0; y < (ssize_t) image->extract_info.height; y++)
712 register const Quantum
721 if (count != (ssize_t) length)
723 ThrowFileException(exception,CorruptImageError,
724 "UnexpectedEndOfFile",image->filename);
727 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
729 if (q == (Quantum *) NULL)
731 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
732 quantum_info,CyanQuantum,pixels,exception);
733 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
735 if (((y-image->extract_info.y) >= 0) &&
736 ((y-image->extract_info.y) < (ssize_t) image->rows))
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);
742 if ((p == (const Quantum *) NULL) ||
743 (q == (Quantum *) NULL))
745 for (x=0; x < (ssize_t) image->columns; x++)
747 SetPixelRed(image,GetPixelRed(canvas_image,p),q);
748 p+=GetPixelChannels(canvas_image);
749 q+=GetPixelChannels(image);
751 if (SyncAuthenticPixels(image,exception) == MagickFalse)
754 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
757 if (image->previous == (Image *) NULL)
759 status=SetImageProgress(image,LoadImageTag,1,5);
760 if (status == MagickFalse)
763 (void) CloseBlob(image);
764 AppendImageFormat("M",image->filename);
765 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
766 if (status == MagickFalse)
768 canvas_image=DestroyImageList(canvas_image);
769 image=DestroyImageList(image);
770 return((Image *) NULL);
772 length=GetQuantumExtent(canvas_image,quantum_info,MagentaQuantum);
773 for (i=0; i < (ssize_t) scene; i++)
774 for (y=0; y < (ssize_t) image->extract_info.height; y++)
776 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
778 if (count != (ssize_t) length)
780 ThrowFileException(exception,CorruptImageError,
781 "UnexpectedEndOfFile",image->filename);
785 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
787 for (y=0; y < (ssize_t) image->extract_info.height; y++)
789 register const Quantum
798 if (count != (ssize_t) length)
800 ThrowFileException(exception,CorruptImageError,
801 "UnexpectedEndOfFile",image->filename);
804 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
806 if (q == (Quantum *) NULL)
808 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
809 quantum_info,MagentaQuantum,pixels,exception);
810 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
812 if (((y-image->extract_info.y) >= 0) &&
813 ((y-image->extract_info.y) < (ssize_t) image->rows))
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);
819 if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL))
821 for (x=0; x < (ssize_t) image->columns; x++)
823 SetPixelGreen(image,GetPixelGreen(canvas_image,p),q);
824 p+=GetPixelChannels(canvas_image);
825 q+=GetPixelChannels(image);
827 if (SyncAuthenticPixels(image,exception) == MagickFalse)
830 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
833 if (image->previous == (Image *) NULL)
835 status=SetImageProgress(image,LoadImageTag,2,5);
836 if (status == MagickFalse)
839 (void) CloseBlob(image);
840 AppendImageFormat("Y",image->filename);
841 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
842 if (status == MagickFalse)
844 canvas_image=DestroyImageList(canvas_image);
845 image=DestroyImageList(image);
846 return((Image *) NULL);
848 length=GetQuantumExtent(canvas_image,quantum_info,YellowQuantum);
849 for (i=0; i < (ssize_t) scene; i++)
850 for (y=0; y < (ssize_t) image->extract_info.height; y++)
852 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
854 if (count != (ssize_t) length)
856 ThrowFileException(exception,CorruptImageError,
857 "UnexpectedEndOfFile",image->filename);
861 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
863 for (y=0; y < (ssize_t) image->extract_info.height; y++)
865 register const Quantum
874 if (count != (ssize_t) length)
876 ThrowFileException(exception,CorruptImageError,
877 "UnexpectedEndOfFile",image->filename);
880 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
882 if (q == (Quantum *) NULL)
884 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
885 quantum_info,YellowQuantum,pixels,exception);
886 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
888 if (((y-image->extract_info.y) >= 0) &&
889 ((y-image->extract_info.y) < (ssize_t) image->rows))
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);
895 if ((p == (const Quantum *) NULL) ||
896 (q == (Quantum *) NULL))
898 for (x=0; x < (ssize_t) image->columns; x++)
900 SetPixelBlue(image,GetPixelBlue(canvas_image,p),q);
901 p+=GetPixelChannels(canvas_image);
902 q+=GetPixelChannels(image);
904 if (SyncAuthenticPixels(image,exception) == MagickFalse)
907 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
910 if (image->previous == (Image *) NULL)
912 status=SetImageProgress(image,LoadImageTag,3,5);
913 if (status == MagickFalse)
916 (void) CloseBlob(image);
917 AppendImageFormat("K",image->filename);
918 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
919 if (status == MagickFalse)
921 canvas_image=DestroyImageList(canvas_image);
922 image=DestroyImageList(image);
923 return((Image *) NULL);
925 length=GetQuantumExtent(canvas_image,quantum_info,BlackQuantum);
926 for (i=0; i < (ssize_t) scene; i++)
927 for (y=0; y < (ssize_t) image->extract_info.height; y++)
929 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
931 if (count != (ssize_t) length)
933 ThrowFileException(exception,CorruptImageError,
934 "UnexpectedEndOfFile",image->filename);
938 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
940 for (y=0; y < (ssize_t) image->extract_info.height; y++)
942 register const Quantum
951 if (count != (ssize_t) length)
953 ThrowFileException(exception,CorruptImageError,
954 "UnexpectedEndOfFile",image->filename);
957 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
959 if (q == (Quantum *) NULL)
961 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
962 quantum_info,BlackQuantum,pixels,exception);
963 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
965 if (((y-image->extract_info.y) >= 0) &&
966 ((y-image->extract_info.y) < (ssize_t) image->rows))
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);
972 if ((p == (const Quantum *) NULL) ||
973 (q == (Quantum *) NULL))
975 for (x=0; x < (ssize_t) image->columns; x++)
977 SetPixelBlack(image,GetPixelBlack(canvas_image,p),q);
978 p+=GetPixelChannels(canvas_image);
979 q+=GetPixelChannels(image);
981 if (SyncAuthenticPixels(image,exception) == MagickFalse)
984 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
987 if (image->previous == (Image *) NULL)
989 status=SetImageProgress(image,LoadImageTag,3,5);
990 if (status == MagickFalse)
993 if (image->alpha_trait != UndefinedPixelTrait)
995 (void) CloseBlob(image);
996 AppendImageFormat("A",image->filename);
997 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
998 if (status == MagickFalse)
1000 canvas_image=DestroyImageList(canvas_image);
1001 image=DestroyImageList(image);
1002 return((Image *) NULL);
1004 length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum);
1005 for (i=0; i < (ssize_t) scene; i++)
1006 for (y=0; y < (ssize_t) image->extract_info.height; y++)
1008 pixels=ReadBlobStream(image,length,
1009 GetQuantumPixels(quantum_info),&count);
1010 if (count != (ssize_t) length)
1012 ThrowFileException(exception,CorruptImageError,
1013 "UnexpectedEndOfFile",image->filename);
1017 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
1019 for (y=0; y < (ssize_t) image->extract_info.height; y++)
1021 register const Quantum
1030 if (count != (ssize_t) length)
1032 ThrowFileException(exception,CorruptImageError,
1033 "UnexpectedEndOfFile",image->filename);
1036 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
1038 if (q == (Quantum *) NULL)
1040 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
1041 quantum_info,YellowQuantum,pixels,exception);
1042 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
1044 if (((y-image->extract_info.y) >= 0) &&
1045 ((y-image->extract_info.y) < (ssize_t) image->rows))
1047 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
1048 0,canvas_image->columns,1,exception);
1049 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
1050 image->columns,1,exception);
1051 if ((p == (const Quantum *) NULL) ||
1052 (q == (Quantum *) NULL))
1054 for (x=0; x < (ssize_t) image->columns; x++)
1056 SetPixelAlpha(image,GetPixelAlpha(canvas_image,p),q);
1057 p+=GetPixelChannels(canvas_image);
1058 q+=GetPixelChannels(image);
1060 if (SyncAuthenticPixels(image,exception) == MagickFalse)
1063 pixels=ReadBlobStream(image,length,GetQuantumPixels(quantum_info),
1066 if (image->previous == (Image *) NULL)
1068 status=SetImageProgress(image,LoadImageTag,4,5);
1069 if (status == MagickFalse)
1073 if (image->previous == (Image *) NULL)
1075 status=SetImageProgress(image,LoadImageTag,5,5);
1076 if (status == MagickFalse)
1082 SetQuantumImageType(image,quantum_type);
1084 Proceed to next image.
1086 if (image_info->number_scenes != 0)
1087 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
1089 if (count == (ssize_t) length)
1092 Allocate next image structure.
1094 AcquireNextImage(image_info,image,exception);
1095 if (GetNextImageInList(image) == (Image *) NULL)
1097 image=DestroyImageList(image);
1098 return((Image *) NULL);
1100 image=SyncNextImageInList(image);
1101 status=SetImageProgress(image,LoadImagesTag,TellBlob(image),
1102 GetBlobSize(image));
1103 if (status == MagickFalse)
1107 } while (count == (ssize_t) length);
1108 quantum_info=DestroyQuantumInfo(quantum_info);
1109 canvas_image=DestroyImage(canvas_image);
1110 (void) CloseBlob(image);
1111 return(GetFirstImageInList(image));
1115 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1119 % R e g i s t e r C M Y K I m a g e %
1123 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1125 % RegisterCMYKImage() adds attributes for the CMYK image format to
1126 % the list of supported formats. The attributes include the image format
1127 % tag, a method to read and/or write the format, whether the format
1128 % supports the saving of more than one frame to the same file or blob,
1129 % whether the format supports native in-memory I/O, and a brief
1130 % description of the format.
1132 % The format of the RegisterCMYKImage method is:
1134 % size_t RegisterCMYKImage(void)
1137 ModuleExport size_t RegisterCMYKImage(void)
1142 entry=AcquireMagickInfo("CMYK","CMYK",
1143 "Raw cyan, magenta, yellow, and black samples");
1144 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1145 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
1146 entry->flags|=CoderRawSupportFlag;
1147 entry->flags|=CoderEndianSupportFlag;
1148 (void) RegisterMagickInfo(entry);
1149 entry=AcquireMagickInfo("CMYK","CMYKA",
1150 "Raw cyan, magenta, yellow, black, and alpha samples");
1151 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1152 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
1153 entry->flags|=CoderRawSupportFlag;
1154 entry->flags|=CoderEndianSupportFlag;
1155 (void) RegisterMagickInfo(entry);
1156 return(MagickImageCoderSignature);
1160 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1164 % U n r e g i s t e r C M Y K I m a g e %
1168 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1170 % UnregisterCMYKImage() removes format registrations made by the
1171 % CMYK module from the list of supported formats.
1173 % The format of the UnregisterCMYKImage method is:
1175 % UnregisterCMYKImage(void)
1178 ModuleExport void UnregisterCMYKImage(void)
1180 (void) UnregisterMagickInfo("CMYK");
1181 (void) UnregisterMagickInfo("CMYKA");
1185 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1189 % W r i t e C M Y K I m a g e %
1193 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1195 % WriteCMYKImage() writes an image to a file in cyan, magenta, yellow, and
1196 % black,rasterfile format.
1198 % The format of the WriteCMYKImage method is:
1200 % MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
1201 % Image *image,ExceptionInfo *exception)
1203 % A description of each parameter follows.
1205 % o image_info: the image info.
1207 % o image: The image.
1209 % o exception: return any errors or warnings in this structure.
1212 static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
1213 Image *image,ExceptionInfo *exception)
1238 Allocate memory for pixels.
1240 assert(image_info != (const ImageInfo *) NULL);
1241 assert(image_info->signature == MagickSignature);
1242 assert(image != (Image *) NULL);
1243 assert(image->signature == MagickSignature);
1244 if (image->debug != MagickFalse)
1245 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1246 if (image_info->interlace != PartitionInterlace)
1249 Open output image file.
1251 status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
1252 if (status == MagickFalse)
1259 Convert MIFF to CMYK raster pixels.
1261 if (image->colorspace != CMYKColorspace)
1262 (void) TransformImageColorspace(image,CMYKColorspace,exception);
1263 quantum_type=CMYKQuantum;
1264 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
1266 quantum_type=CMYKAQuantum;
1267 if (image->alpha_trait == UndefinedPixelTrait)
1268 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel,exception);
1270 quantum_info=AcquireQuantumInfo(image_info,image);
1271 if (quantum_info == (QuantumInfo *) NULL)
1272 ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
1273 pixels=GetQuantumPixels(quantum_info);
1274 switch (image_info->interlace)
1280 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
1282 for (y=0; y < (ssize_t) image->rows; y++)
1284 register const Quantum
1287 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1288 if (p == (const Quantum *) NULL)
1290 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1291 quantum_type,pixels,exception);
1292 count=WriteBlob(image,length,pixels);
1293 if (count != (ssize_t) length)
1295 if (image->previous == (Image *) NULL)
1297 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1299 if (status == MagickFalse)
1308 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
1310 for (y=0; y < (ssize_t) image->rows; y++)
1312 register const Quantum
1315 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1316 if (p == (const Quantum *) NULL)
1318 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1319 CyanQuantum,pixels,exception);
1320 count=WriteBlob(image,length,pixels);
1321 if (count != (ssize_t) length)
1323 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1324 MagentaQuantum,pixels,exception);
1325 count=WriteBlob(image,length,pixels);
1326 if (count != (ssize_t) length)
1328 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1329 YellowQuantum,pixels,exception);
1330 count=WriteBlob(image,length,pixels);
1331 if (count != (ssize_t) length)
1333 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1334 BlackQuantum,pixels,exception);
1335 count=WriteBlob(image,length,pixels);
1336 if (count != (ssize_t) length)
1338 if (quantum_type == CMYKAQuantum)
1340 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1341 AlphaQuantum,pixels,exception);
1342 count=WriteBlob(image,length,pixels);
1343 if (count != (ssize_t) length)
1346 if (image->previous == (Image *) NULL)
1348 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1350 if (status == MagickFalse)
1356 case PlaneInterlace:
1359 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
1361 for (y=0; y < (ssize_t) image->rows; y++)
1363 register const Quantum
1366 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1367 if (p == (const Quantum *) NULL)
1369 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1370 CyanQuantum,pixels,exception);
1371 count=WriteBlob(image,length,pixels);
1372 if (count != (ssize_t) length)
1375 if (image->previous == (Image *) NULL)
1377 status=SetImageProgress(image,SaveImageTag,1,6);
1378 if (status == MagickFalse)
1381 for (y=0; y < (ssize_t) image->rows; y++)
1383 register const Quantum
1386 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1387 if (p == (const Quantum *) NULL)
1389 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1390 MagentaQuantum,pixels,exception);
1391 count=WriteBlob(image,length,pixels);
1392 if (count != (ssize_t) length)
1395 if (image->previous == (Image *) NULL)
1397 status=SetImageProgress(image,SaveImageTag,2,6);
1398 if (status == MagickFalse)
1401 for (y=0; y < (ssize_t) image->rows; y++)
1403 register const Quantum
1406 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1407 if (p == (const Quantum *) NULL)
1409 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1410 YellowQuantum,pixels,exception);
1411 count=WriteBlob(image,length,pixels);
1412 if (count != (ssize_t) length)
1415 if (image->previous == (Image *) NULL)
1417 status=SetImageProgress(image,SaveImageTag,3,6);
1418 if (status == MagickFalse)
1421 for (y=0; y < (ssize_t) image->rows; y++)
1423 register const Quantum
1426 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1427 if (p == (const Quantum *) NULL)
1429 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1430 BlackQuantum,pixels,exception);
1431 count=WriteBlob(image,length,pixels);
1432 if (count != (ssize_t) length)
1435 if (image->previous == (Image *) NULL)
1437 status=SetImageProgress(image,SaveImageTag,4,6);
1438 if (status == MagickFalse)
1441 if (quantum_type == CMYKAQuantum)
1443 for (y=0; y < (ssize_t) image->rows; y++)
1445 register const Quantum
1448 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1449 if (p == (const Quantum *) NULL)
1451 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1452 AlphaQuantum,pixels,exception);
1453 count=WriteBlob(image,length,pixels);
1454 if (count != (ssize_t) length)
1457 if (image->previous == (Image *) NULL)
1459 status=SetImageProgress(image,SaveImageTag,5,6);
1460 if (status == MagickFalse)
1464 if (image_info->interlace == PartitionInterlace)
1465 (void) CopyMagickString(image->filename,image_info->filename,
1467 if (image->previous == (Image *) NULL)
1469 status=SetImageProgress(image,SaveImageTag,6,6);
1470 if (status == MagickFalse)
1475 case PartitionInterlace:
1478 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
1480 AppendImageFormat("C",image->filename);
1481 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1482 AppendBinaryBlobMode,exception);
1483 if (status == MagickFalse)
1485 for (y=0; y < (ssize_t) image->rows; y++)
1487 register const Quantum
1490 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1491 if (p == (const Quantum *) NULL)
1493 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1494 CyanQuantum,pixels,exception);
1495 count=WriteBlob(image,length,pixels);
1496 if (count != (ssize_t) length)
1499 if (image->previous == (Image *) NULL)
1501 status=SetImageProgress(image,SaveImageTag,1,6);
1502 if (status == MagickFalse)
1505 (void) CloseBlob(image);
1506 AppendImageFormat("M",image->filename);
1507 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1508 AppendBinaryBlobMode,exception);
1509 if (status == MagickFalse)
1511 for (y=0; y < (ssize_t) image->rows; y++)
1513 register const Quantum
1516 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1517 if (p == (const Quantum *) NULL)
1519 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1520 MagentaQuantum,pixels,exception);
1521 count=WriteBlob(image,length,pixels);
1522 if (count != (ssize_t) length)
1525 if (image->previous == (Image *) NULL)
1527 status=SetImageProgress(image,SaveImageTag,2,6);
1528 if (status == MagickFalse)
1531 (void) CloseBlob(image);
1532 AppendImageFormat("Y",image->filename);
1533 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1534 AppendBinaryBlobMode,exception);
1535 if (status == MagickFalse)
1537 for (y=0; y < (ssize_t) image->rows; y++)
1539 register const Quantum
1542 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1543 if (p == (const Quantum *) NULL)
1545 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1546 YellowQuantum,pixels,exception);
1547 count=WriteBlob(image,length,pixels);
1548 if (count != (ssize_t) length)
1551 if (image->previous == (Image *) NULL)
1553 status=SetImageProgress(image,SaveImageTag,3,6);
1554 if (status == MagickFalse)
1557 (void) CloseBlob(image);
1558 AppendImageFormat("K",image->filename);
1559 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1560 AppendBinaryBlobMode,exception);
1561 if (status == MagickFalse)
1563 for (y=0; y < (ssize_t) image->rows; y++)
1565 register const Quantum
1568 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1569 if (p == (const Quantum *) NULL)
1571 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1572 BlackQuantum,pixels,exception);
1573 count=WriteBlob(image,length,pixels);
1574 if (count != (ssize_t) length)
1577 if (image->previous == (Image *) NULL)
1579 status=SetImageProgress(image,SaveImageTag,4,6);
1580 if (status == MagickFalse)
1583 if (quantum_type == CMYKAQuantum)
1585 (void) CloseBlob(image);
1586 AppendImageFormat("A",image->filename);
1587 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1588 AppendBinaryBlobMode,exception);
1589 if (status == MagickFalse)
1591 for (y=0; y < (ssize_t) image->rows; y++)
1593 register const Quantum
1596 p=GetVirtualPixels(image,0,y,image->columns,1,exception);
1597 if (p == (const Quantum *) NULL)
1599 length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info,
1600 AlphaQuantum,pixels,exception);
1601 count=WriteBlob(image,length,pixels);
1602 if (count != (ssize_t) length)
1605 if (image->previous == (Image *) NULL)
1607 status=SetImageProgress(image,SaveImageTag,5,6);
1608 if (status == MagickFalse)
1612 (void) CloseBlob(image);
1613 (void) CopyMagickString(image->filename,image_info->filename,
1615 if (image->previous == (Image *) NULL)
1617 status=SetImageProgress(image,SaveImageTag,6,6);
1618 if (status == MagickFalse)
1624 quantum_info=DestroyQuantumInfo(quantum_info);
1625 if (GetNextImageInList(image) == (Image *) NULL)
1627 image=SyncNextImageInList(image);
1628 status=SetImageProgress(image,SaveImagesTag,scene++,
1629 GetImageListLength(image));
1630 if (status == MagickFalse)
1632 } while (image_info->adjoin != MagickFalse);
1633 (void) CloseBlob(image);