2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13 % Read/Write RAW CMYK Image Format %
20 % Copyright 1999-2011 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)
133 assert(image_info != (const ImageInfo *) NULL);
134 assert(image_info->signature == MagickSignature);
135 if (image_info->debug != MagickFalse)
136 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
137 image_info->filename);
138 assert(exception != (ExceptionInfo *) NULL);
139 assert(exception->signature == MagickSignature);
140 image=AcquireImage(image_info);
141 if ((image->columns == 0) || (image->rows == 0))
142 ThrowReaderException(OptionError,"MustSpecifyImageSize");
143 image->colorspace=CMYKColorspace;
144 if (image_info->interlace != PartitionInterlace)
146 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
147 if (status == MagickFalse)
149 image=DestroyImageList(image);
150 return((Image *) NULL);
152 if (DiscardBlobBytes(image,image->offset) == MagickFalse)
153 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
157 Create virtual canvas to support cropping (i.e. image.cmyk[100x100+10+20]).
159 canvas_image=CloneImage(image,image->extract_info.width,1,MagickFalse,
161 (void) SetImageVirtualPixelMethod(canvas_image,BlackVirtualPixelMethod);
162 quantum_info=AcquireQuantumInfo(image_info,canvas_image);
163 if (quantum_info == (QuantumInfo *) NULL)
164 ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
165 pixels=GetQuantumPixels(quantum_info);
166 quantum_type=CMYKQuantum;
167 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
169 quantum_type=CMYKAQuantum;
170 image->matte=MagickTrue;
172 if (image_info->number_scenes != 0)
173 while (image->scene < image_info->scene)
179 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
180 for (y=0; y < (ssize_t) image->rows; y++)
182 count=ReadBlob(image,length,pixels);
183 if (count != (ssize_t) length)
193 Read pixels to virtual canvas image then push to image.
195 if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0))
196 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
198 image->colorspace=CMYKColorspace;
199 switch (image_info->interlace)
205 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
209 length=GetQuantumExtent(canvas_image,quantum_info,quantum_type);
210 count=ReadBlob(image,length,pixels);
212 for (y=0; y < (ssize_t) image->extract_info.height; y++)
214 register const IndexPacket
215 *restrict canvas_indexes;
217 register const PixelPacket
229 if (count != (ssize_t) length)
231 ThrowFileException(exception,CorruptImageError,
232 "UnexpectedEndOfFile",image->filename);
235 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
237 if (q == (PixelPacket *) NULL)
239 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
240 quantum_info,quantum_type,pixels,exception);
241 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
243 if (((y-image->extract_info.y) >= 0) &&
244 ((y-image->extract_info.y) < (ssize_t) image->rows))
246 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
247 canvas_image->columns,1,exception);
248 q=QueueAuthenticPixels(image,0,y-image->extract_info.y,
249 image->columns,1,exception);
250 if ((p == (const PixelPacket *) NULL) ||
251 (q == (PixelPacket *) NULL))
253 canvas_indexes=GetVirtualIndexQueue(canvas_image);
254 indexes=GetAuthenticIndexQueue(image);
255 for (x=0; x < (ssize_t) image->columns; x++)
257 SetRedPixelComponent(q,GetRedPixelComponent(p));
258 SetGreenPixelComponent(q,GetGreenPixelComponent(p));
259 SetBluePixelComponent(q,GetBluePixelComponent(p));
260 indexes[x]=canvas_indexes[image->extract_info.x+x];
261 SetOpacityPixelComponent(q,OpaqueOpacity);
262 if (image->matte != MagickFalse)
263 SetOpacityPixelComponent(q,GetOpacityPixelComponent(p));
267 if (SyncAuthenticPixels(image,exception) == MagickFalse)
270 if (image->previous == (Image *) NULL)
272 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
274 if (status == MagickFalse)
277 count=ReadBlob(image,length,pixels);
294 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
298 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
299 count=ReadBlob(image,length,pixels);
301 for (y=0; y < (ssize_t) image->extract_info.height; y++)
303 register const IndexPacket
304 *restrict canvas_indexes;
306 register const PixelPacket
318 if (count != (ssize_t) length)
320 ThrowFileException(exception,CorruptImageError,
321 "UnexpectedEndOfFile",image->filename);
324 for (i=0; i < (image->matte != MagickFalse ? 5 : 4); i++)
326 quantum_type=quantum_types[i];
327 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
329 if (q == (PixelPacket *) NULL)
331 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
332 quantum_info,quantum_type,pixels,exception);
333 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
335 if (((y-image->extract_info.y) >= 0) &&
336 ((y-image->extract_info.y) < (ssize_t) image->rows))
338 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
339 0,canvas_image->columns,1,exception);
340 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
341 image->columns,1,exception);
342 if ((p == (const PixelPacket *) NULL) ||
343 (q == (PixelPacket *) NULL))
345 canvas_indexes=GetVirtualIndexQueue(canvas_image);
346 indexes=GetAuthenticIndexQueue(image);
347 for (x=0; x < (ssize_t) image->columns; x++)
349 switch (quantum_type)
353 SetCyanPixelComponent(q,GetCyanPixelComponent(p));
358 SetMagentaPixelComponent(q,GetMagentaPixelComponent(p));
363 SetYellowPixelComponent(q,GetYellowPixelComponent(p));
368 indexes[x]=canvas_indexes[image->extract_info.x+x];
373 SetOpacityPixelComponent(q,GetOpacityPixelComponent(p));
382 if (SyncAuthenticPixels(image,exception) == MagickFalse)
385 count=ReadBlob(image,length,pixels);
387 if (image->previous == (Image *) NULL)
389 status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
391 if (status == MagickFalse)
400 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
404 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
405 count=ReadBlob(image,length,pixels);
407 for (y=0; y < (ssize_t) image->extract_info.height; y++)
409 register const PixelPacket
418 if (count != (ssize_t) length)
420 ThrowFileException(exception,CorruptImageError,
421 "UnexpectedEndOfFile",image->filename);
424 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
426 if (q == (PixelPacket *) NULL)
428 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
429 quantum_info,CyanQuantum,pixels,exception);
430 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
432 if (((y-image->extract_info.y) >= 0) &&
433 ((y-image->extract_info.y) < (ssize_t) image->rows))
435 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
436 canvas_image->columns,1,exception);
437 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
438 image->columns,1,exception);
439 if ((p == (const PixelPacket *) NULL) ||
440 (q == (PixelPacket *) NULL))
442 for (x=0; x < (ssize_t) image->columns; x++)
444 SetRedPixelComponent(q,GetRedPixelComponent(p));
448 if (SyncAuthenticPixels(image,exception) == MagickFalse)
451 count=ReadBlob(image,length,pixels);
453 if (image->previous == (Image *) NULL)
455 status=SetImageProgress(image,LoadImageTag,1,6);
456 if (status == MagickFalse)
459 for (y=0; y < (ssize_t) image->extract_info.height; y++)
461 register const PixelPacket
470 if (count != (ssize_t) length)
472 ThrowFileException(exception,CorruptImageError,
473 "UnexpectedEndOfFile",image->filename);
476 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
478 if (q == (PixelPacket *) NULL)
480 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
481 quantum_info,MagentaQuantum,pixels,exception);
482 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
484 if (((y-image->extract_info.y) >= 0) &&
485 ((y-image->extract_info.y) < (ssize_t) image->rows))
487 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
488 canvas_image->columns,1,exception);
489 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
490 image->columns,1,exception);
491 if ((p == (const PixelPacket *) NULL) ||
492 (q == (PixelPacket *) NULL))
494 for (x=0; x < (ssize_t) image->columns; x++)
496 SetGreenPixelComponent(q,GetGreenPixelComponent(p));
500 if (SyncAuthenticPixels(image,exception) == MagickFalse)
503 count=ReadBlob(image,length,pixels);
505 if (image->previous == (Image *) NULL)
507 status=SetImageProgress(image,LoadImageTag,2,6);
508 if (status == MagickFalse)
511 for (y=0; y < (ssize_t) image->extract_info.height; y++)
513 register const PixelPacket
522 if (count != (ssize_t) length)
524 ThrowFileException(exception,CorruptImageError,
525 "UnexpectedEndOfFile",image->filename);
528 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
530 if (q == (PixelPacket *) NULL)
532 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
533 quantum_info,YellowQuantum,pixels,exception);
534 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
536 if (((y-image->extract_info.y) >= 0) &&
537 ((y-image->extract_info.y) < (ssize_t) image->rows))
539 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
540 canvas_image->columns,1,exception);
541 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
542 image->columns,1,exception);
543 if ((p == (const PixelPacket *) NULL) ||
544 (q == (PixelPacket *) NULL))
546 for (x=0; x < (ssize_t) image->columns; x++)
548 SetBluePixelComponent(q,GetBluePixelComponent(p));
552 if (SyncAuthenticPixels(image,exception) == MagickFalse)
555 count=ReadBlob(image,length,pixels);
557 if (image->previous == (Image *) NULL)
559 status=SetImageProgress(image,LoadImageTag,3,6);
560 if (status == MagickFalse)
563 for (y=0; y < (ssize_t) image->extract_info.height; y++)
565 register const IndexPacket
566 *restrict canvas_indexes;
568 register const PixelPacket
580 if (count != (ssize_t) length)
582 ThrowFileException(exception,CorruptImageError,
583 "UnexpectedEndOfFile",image->filename);
586 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
588 if (q == (PixelPacket *) NULL)
590 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
591 quantum_info,BlackQuantum,pixels,exception);
592 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
594 if (((y-image->extract_info.y) >= 0) &&
595 ((y-image->extract_info.y) < (ssize_t) image->rows))
597 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
598 canvas_image->columns,1,exception);
599 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
600 image->columns,1,exception);
601 if ((p == (const PixelPacket *) NULL) ||
602 (q == (PixelPacket *) NULL))
604 canvas_indexes=GetVirtualIndexQueue(canvas_image);
605 indexes=GetAuthenticIndexQueue(image);
606 for (x=0; x < (ssize_t) image->columns; x++)
608 indexes[x]=canvas_indexes[image->extract_info.x+x];
612 if (SyncAuthenticPixels(image,exception) == MagickFalse)
615 count=ReadBlob(image,length,pixels);
617 if (image->previous == (Image *) NULL)
619 status=SetImageProgress(image,LoadImageTag,4,6);
620 if (status == MagickFalse)
623 if (image->matte != MagickFalse)
625 for (y=0; y < (ssize_t) image->extract_info.height; y++)
627 register const PixelPacket
636 if (count != (ssize_t) length)
638 ThrowFileException(exception,CorruptImageError,
639 "UnexpectedEndOfFile",image->filename);
642 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
644 if (q == (PixelPacket *) NULL)
646 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
647 quantum_info,AlphaQuantum,pixels,exception);
648 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
650 if (((y-image->extract_info.y) >= 0) &&
651 ((y-image->extract_info.y) < (ssize_t) image->rows))
653 p=GetVirtualPixels(canvas_image,
654 canvas_image->extract_info.x,0,canvas_image->columns,1,
656 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
657 image->columns,1,exception);
658 if ((p == (const PixelPacket *) NULL) ||
659 (q == (PixelPacket *) NULL))
661 for (x=0; x < (ssize_t) image->columns; x++)
663 SetOpacityPixelComponent(q,GetOpacityPixelComponent(p));
667 if (SyncAuthenticPixels(image,exception) == MagickFalse)
670 count=ReadBlob(image,length,pixels);
672 if (image->previous == (Image *) NULL)
674 status=SetImageProgress(image,LoadImageTag,5,6);
675 if (status == MagickFalse)
679 if (image->previous == (Image *) NULL)
681 status=SetImageProgress(image,LoadImageTag,6,6);
682 if (status == MagickFalse)
687 case PartitionInterlace:
690 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
692 AppendImageFormat("C",image->filename);
693 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
694 if (status == MagickFalse)
696 canvas_image=DestroyImageList(canvas_image);
697 image=DestroyImageList(image);
698 return((Image *) NULL);
700 if (DiscardBlobBytes(image,image->offset) == MagickFalse)
701 ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
703 length=GetQuantumExtent(canvas_image,quantum_info,CyanQuantum);
704 for (i=0; i < (ssize_t) scene; i++)
705 for (y=0; y < (ssize_t) image->extract_info.height; y++)
706 if (ReadBlob(image,length,pixels) != (ssize_t) length)
708 ThrowFileException(exception,CorruptImageError,
709 "UnexpectedEndOfFile",image->filename);
712 count=ReadBlob(image,length,pixels);
713 for (y=0; y < (ssize_t) image->extract_info.height; y++)
715 register const PixelPacket
724 if (count != (ssize_t) length)
726 ThrowFileException(exception,CorruptImageError,
727 "UnexpectedEndOfFile",image->filename);
730 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
732 if (q == (PixelPacket *) NULL)
734 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
735 quantum_info,CyanQuantum,pixels,exception);
736 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
738 if (((y-image->extract_info.y) >= 0) &&
739 ((y-image->extract_info.y) < (ssize_t) image->rows))
741 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
742 canvas_image->columns,1,exception);
743 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
744 image->columns,1,exception);
745 if ((p == (const PixelPacket *) NULL) ||
746 (q == (PixelPacket *) NULL))
748 for (x=0; x < (ssize_t) image->columns; x++)
750 SetRedPixelComponent(q,GetRedPixelComponent(p));
754 if (SyncAuthenticPixels(image,exception) == MagickFalse)
757 count=ReadBlob(image,length,pixels);
759 if (image->previous == (Image *) NULL)
761 status=SetImageProgress(image,LoadImageTag,1,5);
762 if (status == MagickFalse)
765 (void) CloseBlob(image);
766 AppendImageFormat("M",image->filename);
767 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
768 if (status == MagickFalse)
770 canvas_image=DestroyImageList(canvas_image);
771 image=DestroyImageList(image);
772 return((Image *) NULL);
774 length=GetQuantumExtent(canvas_image,quantum_info,MagentaQuantum);
775 for (i=0; i < (ssize_t) scene; i++)
776 for (y=0; y < (ssize_t) image->extract_info.height; y++)
777 if (ReadBlob(image,length,pixels) != (ssize_t) length)
779 ThrowFileException(exception,CorruptImageError,
780 "UnexpectedEndOfFile",image->filename);
783 count=ReadBlob(image,length,pixels);
784 for (y=0; y < (ssize_t) image->extract_info.height; y++)
786 register const PixelPacket
795 if (count != (ssize_t) length)
797 ThrowFileException(exception,CorruptImageError,
798 "UnexpectedEndOfFile",image->filename);
801 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
803 if (q == (PixelPacket *) NULL)
805 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
806 quantum_info,MagentaQuantum,pixels,exception);
807 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
809 if (((y-image->extract_info.y) >= 0) &&
810 ((y-image->extract_info.y) < (ssize_t) image->rows))
812 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
813 canvas_image->columns,1,exception);
814 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
815 image->columns,1,exception);
816 if ((p == (const PixelPacket *) NULL) ||
817 (q == (PixelPacket *) NULL))
819 for (x=0; x < (ssize_t) image->columns; x++)
821 SetGreenPixelComponent(q,GetGreenPixelComponent(p));
825 if (SyncAuthenticPixels(image,exception) == MagickFalse)
828 count=ReadBlob(image,length,pixels);
830 if (image->previous == (Image *) NULL)
832 status=SetImageProgress(image,LoadImageTag,2,5);
833 if (status == MagickFalse)
836 (void) CloseBlob(image);
837 AppendImageFormat("Y",image->filename);
838 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
839 if (status == MagickFalse)
841 canvas_image=DestroyImageList(canvas_image);
842 image=DestroyImageList(image);
843 return((Image *) NULL);
845 length=GetQuantumExtent(canvas_image,quantum_info,YellowQuantum);
846 for (i=0; i < (ssize_t) scene; i++)
847 for (y=0; y < (ssize_t) image->extract_info.height; y++)
848 if (ReadBlob(image,length,pixels) != (ssize_t) length)
850 ThrowFileException(exception,CorruptImageError,
851 "UnexpectedEndOfFile",image->filename);
854 count=ReadBlob(image,length,pixels);
855 for (y=0; y < (ssize_t) image->extract_info.height; y++)
857 register const PixelPacket
866 if (count != (ssize_t) length)
868 ThrowFileException(exception,CorruptImageError,
869 "UnexpectedEndOfFile",image->filename);
872 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
874 if (q == (PixelPacket *) NULL)
876 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
877 quantum_info,YellowQuantum,pixels,exception);
878 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
880 if (((y-image->extract_info.y) >= 0) &&
881 ((y-image->extract_info.y) < (ssize_t) image->rows))
883 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
884 canvas_image->columns,1,exception);
885 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
886 image->columns,1,exception);
887 if ((p == (const PixelPacket *) NULL) ||
888 (q == (PixelPacket *) NULL))
890 for (x=0; x < (ssize_t) image->columns; x++)
892 SetBluePixelComponent(q,GetBluePixelComponent(p));
896 if (SyncAuthenticPixels(image,exception) == MagickFalse)
899 count=ReadBlob(image,length,pixels);
901 if (image->previous == (Image *) NULL)
903 status=SetImageProgress(image,LoadImageTag,3,5);
904 if (status == MagickFalse)
907 (void) CloseBlob(image);
908 AppendImageFormat("K",image->filename);
909 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
910 if (status == MagickFalse)
912 canvas_image=DestroyImageList(canvas_image);
913 image=DestroyImageList(image);
914 return((Image *) NULL);
916 length=GetQuantumExtent(canvas_image,quantum_info,BlackQuantum);
917 for (i=0; i < (ssize_t) scene; i++)
918 for (y=0; y < (ssize_t) image->extract_info.height; y++)
919 if (ReadBlob(image,length,pixels) != (ssize_t) length)
921 ThrowFileException(exception,CorruptImageError,
922 "UnexpectedEndOfFile",image->filename);
925 count=ReadBlob(image,length,pixels);
926 for (y=0; y < (ssize_t) image->extract_info.height; y++)
928 register const IndexPacket
929 *restrict canvas_indexes;
931 register const PixelPacket
943 if (count != (ssize_t) length)
945 ThrowFileException(exception,CorruptImageError,
946 "UnexpectedEndOfFile",image->filename);
949 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
951 if (q == (PixelPacket *) NULL)
953 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
954 quantum_info,BlackQuantum,pixels,exception);
955 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
957 if (((y-image->extract_info.y) >= 0) &&
958 ((y-image->extract_info.y) < (ssize_t) image->rows))
960 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,0,
961 canvas_image->columns,1,exception);
962 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
963 image->columns,1,exception);
964 if ((p == (const PixelPacket *) NULL) ||
965 (q == (PixelPacket *) NULL))
967 canvas_indexes=GetVirtualIndexQueue(canvas_image);
968 indexes=GetAuthenticIndexQueue(image);
969 for (x=0; x < (ssize_t) image->columns; x++)
971 indexes[x]=canvas_indexes[image->extract_info.x+x];
975 if (SyncAuthenticPixels(image,exception) == MagickFalse)
978 count=ReadBlob(image,length,pixels);
980 if (image->previous == (Image *) NULL)
982 status=SetImageProgress(image,LoadImageTag,3,5);
983 if (status == MagickFalse)
986 if (image->matte != MagickFalse)
988 (void) CloseBlob(image);
989 AppendImageFormat("A",image->filename);
990 status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
991 if (status == MagickFalse)
993 canvas_image=DestroyImageList(canvas_image);
994 image=DestroyImageList(image);
995 return((Image *) NULL);
997 length=GetQuantumExtent(canvas_image,quantum_info,AlphaQuantum);
998 for (i=0; i < (ssize_t) scene; i++)
999 for (y=0; y < (ssize_t) image->extract_info.height; y++)
1000 if (ReadBlob(image,length,pixels) != (ssize_t) length)
1002 ThrowFileException(exception,CorruptImageError,
1003 "UnexpectedEndOfFile",image->filename);
1006 count=ReadBlob(image,length,pixels);
1007 for (y=0; y < (ssize_t) image->extract_info.height; y++)
1009 register const PixelPacket
1012 register PixelPacket
1018 if (count != (ssize_t) length)
1020 ThrowFileException(exception,CorruptImageError,
1021 "UnexpectedEndOfFile",image->filename);
1024 q=GetAuthenticPixels(canvas_image,0,0,canvas_image->columns,1,
1026 if (q == (PixelPacket *) NULL)
1028 length=ImportQuantumPixels(canvas_image,(CacheView *) NULL,
1029 quantum_info,YellowQuantum,pixels,exception);
1030 if (SyncAuthenticPixels(canvas_image,exception) == MagickFalse)
1032 if (((y-image->extract_info.y) >= 0) &&
1033 ((y-image->extract_info.y) < (ssize_t) image->rows))
1035 p=GetVirtualPixels(canvas_image,canvas_image->extract_info.x,
1036 0,canvas_image->columns,1,exception);
1037 q=GetAuthenticPixels(image,0,y-image->extract_info.y,
1038 image->columns,1,exception);
1039 if ((p == (const PixelPacket *) NULL) ||
1040 (q == (PixelPacket *) NULL))
1042 for (x=0; x < (ssize_t) image->columns; x++)
1044 SetOpacityPixelComponent(q,GetOpacityPixelComponent(p));
1048 if (SyncAuthenticPixels(image,exception) == MagickFalse)
1051 count=ReadBlob(image,length,pixels);
1053 if (image->previous == (Image *) NULL)
1055 status=SetImageProgress(image,LoadImageTag,4,5);
1056 if (status == MagickFalse)
1060 if (image->previous == (Image *) NULL)
1062 status=SetImageProgress(image,LoadImageTag,5,5);
1063 if (status == MagickFalse)
1069 SetQuantumImageType(image,quantum_type);
1071 Proceed to next image.
1073 if (image_info->number_scenes != 0)
1074 if (image->scene >= (image_info->scene+image_info->number_scenes-1))
1076 if (count == (ssize_t) length)
1079 Allocate next image structure.
1081 AcquireNextImage(image_info,image);
1082 if (GetNextImageInList(image) == (Image *) NULL)
1084 image=DestroyImageList(image);
1085 return((Image *) NULL);
1087 image=SyncNextImageInList(image);
1088 status=SetImageProgress(image,LoadImagesTag,TellBlob(image),
1089 GetBlobSize(image));
1090 if (status == MagickFalse)
1094 } while (count == (ssize_t) length);
1095 quantum_info=DestroyQuantumInfo(quantum_info);
1096 InheritException(&image->exception,&canvas_image->exception);
1097 canvas_image=DestroyImage(canvas_image);
1098 (void) CloseBlob(image);
1099 return(GetFirstImageInList(image));
1103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1107 % R e g i s t e r C M Y K I m a g e %
1111 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1113 % RegisterCMYKImage() adds attributes for the CMYK image format to
1114 % the list of supported formats. The attributes include the image format
1115 % tag, a method to read and/or write the format, whether the format
1116 % supports the saving of more than one frame to the same file or blob,
1117 % whether the format supports native in-memory I/O, and a brief
1118 % description of the format.
1120 % The format of the RegisterCMYKImage method is:
1122 % size_t RegisterCMYKImage(void)
1125 ModuleExport size_t RegisterCMYKImage(void)
1130 entry=SetMagickInfo("CMYK");
1131 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1132 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
1133 entry->raw=MagickTrue;
1134 entry->endian_support=MagickTrue;
1135 entry->description=ConstantString("Raw cyan, magenta, yellow, and black "
1137 entry->module=ConstantString("CMYK");
1138 (void) RegisterMagickInfo(entry);
1139 entry=SetMagickInfo("CMYKA");
1140 entry->decoder=(DecodeImageHandler *) ReadCMYKImage;
1141 entry->encoder=(EncodeImageHandler *) WriteCMYKImage;
1142 entry->raw=MagickTrue;
1143 entry->endian_support=MagickTrue;
1144 entry->description=ConstantString("Raw cyan, magenta, yellow, black, and "
1146 entry->module=ConstantString("CMYK");
1147 (void) RegisterMagickInfo(entry);
1148 return(MagickImageCoderSignature);
1152 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1156 % U n r e g i s t e r C M Y K I m a g e %
1160 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1162 % UnregisterCMYKImage() removes format registrations made by the
1163 % CMYK module from the list of supported formats.
1165 % The format of the UnregisterCMYKImage method is:
1167 % UnregisterCMYKImage(void)
1170 ModuleExport void UnregisterCMYKImage(void)
1172 (void) UnregisterMagickInfo("CMYK");
1173 (void) UnregisterMagickInfo("CMYKA");
1177 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1181 % W r i t e C M Y K I m a g e %
1185 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1187 % WriteCMYKImage() writes an image to a file in cyan, magenta, yellow, and
1188 % black,rasterfile format.
1190 % The format of the WriteCMYKImage method is:
1192 % MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
1195 % A description of each parameter follows.
1197 % o image_info: the image info.
1199 % o image: The image.
1202 static MagickBooleanType WriteCMYKImage(const ImageInfo *image_info,
1228 Allocate memory for pixels.
1230 assert(image_info != (const ImageInfo *) NULL);
1231 assert(image_info->signature == MagickSignature);
1232 assert(image != (Image *) NULL);
1233 assert(image->signature == MagickSignature);
1234 if (image->debug != MagickFalse)
1235 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1236 if (image_info->interlace != PartitionInterlace)
1239 Open output image file.
1241 status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
1242 if (status == MagickFalse)
1245 quantum_type=CMYKQuantum;
1246 if (LocaleCompare(image_info->magick,"CMYKA") == 0)
1248 quantum_type=CMYKAQuantum;
1249 image->matte=MagickTrue;
1255 Convert MIFF to CMYK raster pixels.
1257 if (image->colorspace != CMYKColorspace)
1258 (void) TransformImageColorspace(image,CMYKColorspace);
1259 if ((LocaleCompare(image_info->magick,"CMYKA") == 0) &&
1260 (image->matte == MagickFalse))
1261 (void) SetImageAlphaChannel(image,ResetAlphaChannel);
1262 quantum_info=AcquireQuantumInfo(image_info,image);
1263 if (quantum_info == (QuantumInfo *) NULL)
1264 ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
1265 pixels=GetQuantumPixels(quantum_info);
1266 switch (image_info->interlace)
1272 No interlacing: CMYKCMYKCMYKCMYKCMYKCMYK...
1274 for (y=0; y < (ssize_t) image->rows; y++)
1276 register const PixelPacket
1279 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1280 if (p == (const PixelPacket *) NULL)
1282 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1283 quantum_info,quantum_type,pixels,&image->exception);
1284 count=WriteBlob(image,length,pixels);
1285 if (count != (ssize_t) length)
1287 if (image->previous == (Image *) NULL)
1289 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1291 if (status == MagickFalse)
1300 Line interlacing: CCC...MMM...YYY...KKK...CCC...MMM...YYY...KKK...
1302 for (y=0; y < (ssize_t) image->rows; y++)
1304 register const PixelPacket
1307 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1308 if (p == (const PixelPacket *) NULL)
1310 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1311 quantum_info,CyanQuantum,pixels,&image->exception);
1312 count=WriteBlob(image,length,pixels);
1313 if (count != (ssize_t) length)
1315 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1316 quantum_info,MagentaQuantum,pixels,&image->exception);
1317 count=WriteBlob(image,length,pixels);
1318 if (count != (ssize_t) length)
1320 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1321 quantum_info,YellowQuantum,pixels,&image->exception);
1322 count=WriteBlob(image,length,pixels);
1323 if (count != (ssize_t) length)
1325 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1326 quantum_info,BlackQuantum,pixels,&image->exception);
1327 count=WriteBlob(image,length,pixels);
1328 if (count != (ssize_t) length)
1330 if (quantum_type == CMYKAQuantum)
1332 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1333 quantum_info,AlphaQuantum,pixels,&image->exception);
1334 count=WriteBlob(image,length,pixels);
1335 if (count != (ssize_t) length)
1338 if (image->previous == (Image *) NULL)
1340 status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1342 if (status == MagickFalse)
1348 case PlaneInterlace:
1351 Plane interlacing: CCCCCC...MMMMMM...YYYYYY...KKKKKK...
1353 for (y=0; y < (ssize_t) image->rows; y++)
1355 register const PixelPacket
1358 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1359 if (p == (const PixelPacket *) NULL)
1361 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1362 quantum_info,CyanQuantum,pixels,&image->exception);
1363 count=WriteBlob(image,length,pixels);
1364 if (count != (ssize_t) length)
1367 if (image->previous == (Image *) NULL)
1369 status=SetImageProgress(image,SaveImageTag,1,6);
1370 if (status == MagickFalse)
1373 for (y=0; y < (ssize_t) image->rows; y++)
1375 register const PixelPacket
1378 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1379 if (p == (const PixelPacket *) NULL)
1381 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1382 quantum_info,MagentaQuantum,pixels,&image->exception);
1383 count=WriteBlob(image,length,pixels);
1384 if (count != (ssize_t) length)
1387 if (image->previous == (Image *) NULL)
1389 status=SetImageProgress(image,SaveImageTag,2,6);
1390 if (status == MagickFalse)
1393 for (y=0; y < (ssize_t) image->rows; y++)
1395 register const PixelPacket
1398 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1399 if (p == (const PixelPacket *) NULL)
1401 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1402 quantum_info,YellowQuantum,pixels,&image->exception);
1403 count=WriteBlob(image,length,pixels);
1404 if (count != (ssize_t) length)
1407 if (image->previous == (Image *) NULL)
1409 status=SetImageProgress(image,SaveImageTag,3,6);
1410 if (status == MagickFalse)
1413 for (y=0; y < (ssize_t) image->rows; y++)
1415 register const PixelPacket
1418 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1419 if (p == (const PixelPacket *) NULL)
1421 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1422 quantum_info,BlackQuantum,pixels,&image->exception);
1423 count=WriteBlob(image,length,pixels);
1424 if (count != (ssize_t) length)
1427 if (image->previous == (Image *) NULL)
1429 status=SetImageProgress(image,SaveImageTag,4,6);
1430 if (status == MagickFalse)
1433 if (quantum_type == CMYKAQuantum)
1435 for (y=0; y < (ssize_t) image->rows; y++)
1437 register const PixelPacket
1440 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1441 if (p == (const PixelPacket *) NULL)
1443 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1444 quantum_info,AlphaQuantum,pixels,&image->exception);
1445 count=WriteBlob(image,length,pixels);
1446 if (count != (ssize_t) length)
1449 if (image->previous == (Image *) NULL)
1451 status=SetImageProgress(image,SaveImageTag,5,6);
1452 if (status == MagickFalse)
1456 if (image_info->interlace == PartitionInterlace)
1457 (void) CopyMagickString(image->filename,image_info->filename,
1459 if (image->previous == (Image *) NULL)
1461 status=SetImageProgress(image,SaveImageTag,6,6);
1462 if (status == MagickFalse)
1467 case PartitionInterlace:
1470 Partition interlacing: CCCCCC..., MMMMMM..., YYYYYY..., KKKKKK...
1472 AppendImageFormat("C",image->filename);
1473 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1474 AppendBinaryBlobMode,&image->exception);
1475 if (status == MagickFalse)
1477 for (y=0; y < (ssize_t) image->rows; y++)
1479 register const PixelPacket
1482 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1483 if (p == (const PixelPacket *) NULL)
1485 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1486 quantum_info,CyanQuantum,pixels,&image->exception);
1487 count=WriteBlob(image,length,pixels);
1488 if (count != (ssize_t) length)
1491 if (image->previous == (Image *) NULL)
1493 status=SetImageProgress(image,SaveImageTag,1,6);
1494 if (status == MagickFalse)
1497 (void) CloseBlob(image);
1498 AppendImageFormat("M",image->filename);
1499 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1500 AppendBinaryBlobMode,&image->exception);
1501 if (status == MagickFalse)
1503 for (y=0; y < (ssize_t) image->rows; y++)
1505 register const PixelPacket
1508 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1509 if (p == (const PixelPacket *) NULL)
1511 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1512 quantum_info,MagentaQuantum,pixels,&image->exception);
1513 count=WriteBlob(image,length,pixels);
1514 if (count != (ssize_t) length)
1517 if (image->previous == (Image *) NULL)
1519 status=SetImageProgress(image,SaveImageTag,2,6);
1520 if (status == MagickFalse)
1523 (void) CloseBlob(image);
1524 AppendImageFormat("Y",image->filename);
1525 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1526 AppendBinaryBlobMode,&image->exception);
1527 if (status == MagickFalse)
1529 for (y=0; y < (ssize_t) image->rows; y++)
1531 register const PixelPacket
1534 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1535 if (p == (const PixelPacket *) NULL)
1537 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1538 quantum_info,YellowQuantum,pixels,&image->exception);
1539 count=WriteBlob(image,length,pixels);
1540 if (count != (ssize_t) length)
1543 if (image->previous == (Image *) NULL)
1545 status=SetImageProgress(image,SaveImageTag,3,6);
1546 if (status == MagickFalse)
1549 (void) CloseBlob(image);
1550 AppendImageFormat("K",image->filename);
1551 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1552 AppendBinaryBlobMode,&image->exception);
1553 if (status == MagickFalse)
1555 for (y=0; y < (ssize_t) image->rows; y++)
1557 register const PixelPacket
1560 p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
1561 if (p == (const PixelPacket *) NULL)
1563 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1564 quantum_info,BlackQuantum,pixels,&image->exception);
1565 count=WriteBlob(image,length,pixels);
1566 if (count != (ssize_t) length)
1569 if (image->previous == (Image *) NULL)
1571 status=SetImageProgress(image,SaveImageTag,4,6);
1572 if (status == MagickFalse)
1575 if (quantum_type == CMYKAQuantum)
1577 (void) CloseBlob(image);
1578 AppendImageFormat("A",image->filename);
1579 status=OpenBlob(image_info,image,scene == 0 ? WriteBinaryBlobMode :
1580 AppendBinaryBlobMode,&image->exception);
1581 if (status == MagickFalse)
1583 for (y=0; y < (ssize_t) image->rows; y++)
1585 register const PixelPacket
1588 p=GetVirtualPixels(image,0,y,image->columns,1,
1590 if (p == (const PixelPacket *) NULL)
1592 length=ExportQuantumPixels(image,(const CacheView *) NULL,
1593 quantum_info,AlphaQuantum,pixels,&image->exception);
1594 count=WriteBlob(image,length,pixels);
1595 if (count != (ssize_t) length)
1598 if (image->previous == (Image *) NULL)
1600 status=SetImageProgress(image,SaveImageTag,5,6);
1601 if (status == MagickFalse)
1605 (void) CloseBlob(image);
1606 (void) CopyMagickString(image->filename,image_info->filename,
1608 if (image->previous == (Image *) NULL)
1610 status=SetImageProgress(image,SaveImageTag,6,6);
1611 if (status == MagickFalse)
1617 quantum_info=DestroyQuantumInfo(quantum_info);
1618 if (GetNextImageInList(image) == (Image *) NULL)
1620 image=SyncNextImageInList(image);
1621 status=SetImageProgress(image,SaveImagesTag,scene++,
1622 GetImageListLength(image));
1623 if (status == MagickFalse)
1625 } while (image_info->adjoin != MagickFalse);
1626 (void) CloseBlob(image);