2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % PPPP IIIII X X EEEEE L %
10 % P IIIII X X EEEEE LLLLL %
12 % IIIII TTTTT EEEEE RRRR AAA TTTTT OOO RRRR %
13 % I T E R R A A T O O R R %
14 % I T EEE RRRR AAAAA T O O RRRR %
15 % I T E R R A A T O O R R %
16 % IIIII T EEEEE R R A A T OOO R R %
19 % ImageMagick Image Pixel Iterator Methods %
26 % Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
27 % dedicated to making software imaging solutions freely available. %
29 % You may not use this file except in compliance with the License. You may %
30 % obtain a copy of the License at %
32 % http://www.imagemagick.org/script/license.php %
34 % Unless required by applicable law or agreed to in writing, software %
35 % distributed under the License is distributed on an "AS IS" BASIS, %
36 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
37 % See the License for the specific language governing permissions and %
38 % limitations under the License. %
40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49 #include "MagickWand/studio.h"
50 #include "MagickWand/MagickWand.h"
51 #include "MagickWand/magick-wand-private.h"
52 #include "MagickWand/pixel-iterator.h"
53 #include "MagickWand/pixel-wand.h"
54 #include "MagickWand/wand.h"
59 #define PixelIteratorId "PixelIterator"
101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
105 % C l e a r P i x e l I t e r a t o r %
109 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
111 % ClearPixelIterator() clear resources associated with a PixelIterator.
113 % The format of the ClearPixelIterator method is:
115 % PixelIterator *ClearPixelIterator(PixelIterator *iterator)
117 % A description of each parameter follows:
119 % o iterator: the pixel iterator.
122 WandExport void ClearPixelIterator(PixelIterator *iterator)
124 assert(iterator != (const PixelIterator *) NULL);
125 assert(iterator->signature == WandSignature);
126 if (iterator->debug != MagickFalse)
127 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
128 iterator->pixel_wands=DestroyPixelWands(iterator->pixel_wands,
129 iterator->region.width);
130 ClearMagickException(iterator->exception);
131 iterator->pixel_wands=NewPixelWands(iterator->region.width);
132 iterator->active=MagickFalse;
134 iterator->debug=IsEventLogging();
138 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
142 % C l o n e P i x e l I t e r a t o r %
146 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
148 % ClonePixelIterator() makes an exact copy of the specified iterator.
150 % The format of the ClonePixelIterator method is:
152 % PixelIterator *ClonePixelIterator(const PixelIterator *iterator)
154 % A description of each parameter follows:
156 % o iterator: the magick iterator.
159 WandExport PixelIterator *ClonePixelIterator(const PixelIterator *iterator)
164 assert(iterator != (PixelIterator *) NULL);
165 assert(iterator->signature == WandSignature);
166 if (iterator->debug != MagickFalse)
167 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
168 clone_iterator=(PixelIterator *) AcquireMagickMemory(
169 sizeof(*clone_iterator));
170 if (clone_iterator == (PixelIterator *) NULL)
171 ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
173 (void) ResetMagickMemory(clone_iterator,0,sizeof(*clone_iterator));
174 clone_iterator->id=AcquireWandId();
175 (void) FormatLocaleString(clone_iterator->name,MaxTextExtent,"%s-%.20g",
176 PixelIteratorId,(double) clone_iterator->id);
177 clone_iterator->exception=AcquireExceptionInfo();
178 InheritException(clone_iterator->exception,iterator->exception);
179 clone_iterator->image=CloneImage(iterator->image,0,0,MagickTrue,
180 iterator->exception);
181 clone_iterator->view=CloneCacheView(iterator->view);
182 clone_iterator->region=iterator->region;
183 clone_iterator->active=iterator->active;
184 clone_iterator->y=iterator->y;
185 clone_iterator->pixel_wands=ClonePixelWands((const PixelWand **)
186 iterator->pixel_wands,iterator->region.width);
187 clone_iterator->debug=iterator->debug;
188 if (clone_iterator->debug != MagickFalse)
189 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",
190 clone_iterator->name);
191 clone_iterator->signature=WandSignature;
192 return(clone_iterator);
196 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
200 % D e s t r o y P i x e l I t e r a t o r %
204 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
206 % DestroyPixelIterator() deallocates resources associated with a PixelIterator.
208 % The format of the DestroyPixelIterator method is:
210 % PixelIterator *DestroyPixelIterator(PixelIterator *iterator)
212 % A description of each parameter follows:
214 % o iterator: the pixel iterator.
217 WandExport PixelIterator *DestroyPixelIterator(PixelIterator *iterator)
219 assert(iterator != (const PixelIterator *) NULL);
220 assert(iterator->signature == WandSignature);
221 if (iterator->debug != MagickFalse)
222 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
223 iterator->image=DestroyImage(iterator->image);
224 iterator->view=DestroyCacheView(iterator->view);
225 iterator->pixel_wands=DestroyPixelWands(iterator->pixel_wands,
226 iterator->region.width);
227 iterator->exception=DestroyExceptionInfo(iterator->exception);
228 iterator->signature=(~WandSignature);
229 RelinquishWandId(iterator->id);
230 iterator=(PixelIterator *) RelinquishMagickMemory(iterator);
235 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
239 % I s P i x e l I t e r a t o r %
243 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
245 % IsPixelIterator() returns MagickTrue if the iterator is verified as a pixel
248 % The format of the IsPixelIterator method is:
250 % MagickBooleanType IsPixelIterator(const PixelIterator *iterator)
252 % A description of each parameter follows:
254 % o iterator: the magick iterator.
257 WandExport MagickBooleanType IsPixelIterator(const PixelIterator *iterator)
262 if (iterator == (const PixelIterator *) NULL)
264 if (iterator->signature != WandSignature)
266 length=strlen(PixelIteratorId);
267 if (LocaleNCompare(iterator->name,PixelIteratorId,length) != 0)
273 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
277 % N e w P i x e l I t e r a t o r %
281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
283 % NewPixelIterator() returns a new pixel iterator.
285 % The format of the NewPixelIterator method is:
287 % PixelIterator *NewPixelIterator(MagickWand *wand)
289 % A description of each parameter follows:
291 % o wand: the magick wand.
294 WandExport PixelIterator *NewPixelIterator(MagickWand *wand)
311 depth=MAGICKCORE_QUANTUM_DEPTH;
312 quantum=GetMagickQuantumDepth(&depth);
313 if (depth != MAGICKCORE_QUANTUM_DEPTH)
314 ThrowWandFatalException(WandError,"QuantumDepthMismatch",quantum);
315 assert(wand != (MagickWand *) NULL);
316 image=GetImageFromMagickWand(wand);
317 if (image == (Image *) NULL)
318 return((PixelIterator *) NULL);
319 view=AcquireCacheView(image);
320 if (view == (CacheView *) NULL)
321 return((PixelIterator *) NULL);
322 iterator=(PixelIterator *) AcquireMagickMemory(sizeof(*iterator));
323 if (iterator == (PixelIterator *) NULL)
324 ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
325 GetExceptionMessage(errno));
326 (void) ResetMagickMemory(iterator,0,sizeof(*iterator));
327 iterator->id=AcquireWandId();
328 (void) FormatLocaleString(iterator->name,MaxTextExtent,"%s-%.20g",
329 PixelIteratorId,(double) iterator->id);
330 iterator->exception=AcquireExceptionInfo();
331 iterator->image=CloneImage(image,0,0,MagickTrue,iterator->exception);
333 SetGeometry(image,&iterator->region);
334 iterator->region.width=image->columns;
335 iterator->region.height=image->rows;
336 iterator->region.x=0;
337 iterator->region.y=0;
338 iterator->pixel_wands=NewPixelWands(iterator->region.width);
340 iterator->debug=IsEventLogging();
341 if (iterator->debug != MagickFalse)
342 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
343 iterator->signature=WandSignature;
348 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
352 % P i x e l C l e a r I t e r a t o r E x c e p t i o n %
356 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
358 % PixelClearIteratorException() clear any exceptions associated with the
361 % The format of the PixelClearIteratorException method is:
363 % MagickBooleanType PixelClearIteratorException(PixelIterator *wand)
365 % A description of each parameter follows:
367 % o wand: the pixel wand.
370 WandExport MagickBooleanType PixelClearIteratorException(
371 PixelIterator *iterator)
373 assert(iterator != (PixelIterator *) NULL);
374 assert(iterator->signature == WandSignature);
375 if (iterator->debug != MagickFalse)
376 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
377 ClearMagickException(iterator->exception);
382 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
386 % N e w P i x e l R e g i o n I t e r a t o r %
390 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
392 % NewPixelRegionIterator() returns a new pixel iterator.
394 % The format of the NewPixelRegionIterator method is:
396 % PixelIterator NewPixelRegionIterator(MagickWand *wand,const ssize_t x,
397 % const ssize_t y,const size_t width,const size_t height)
399 % A description of each parameter follows:
401 % o wand: the magick wand.
403 % o x,y,columns,rows: These values define the perimeter of a region of
407 WandExport PixelIterator *NewPixelRegionIterator(MagickWand *wand,
408 const ssize_t x,const ssize_t y,const size_t width,const size_t height)
425 assert(wand != (MagickWand *) NULL);
426 depth=MAGICKCORE_QUANTUM_DEPTH;
427 quantum=GetMagickQuantumDepth(&depth);
428 if (depth != MAGICKCORE_QUANTUM_DEPTH)
429 ThrowWandFatalException(WandError,"QuantumDepthMismatch",quantum);
430 if ((width == 0) || (width == 0))
431 ThrowWandFatalException(WandError,"ZeroRegionSize",quantum);
432 image=GetImageFromMagickWand(wand);
433 if (image == (Image *) NULL)
434 return((PixelIterator *) NULL);
435 view=AcquireCacheView(image);
436 if (view == (CacheView *) NULL)
437 return((PixelIterator *) NULL);
438 iterator=(PixelIterator *) AcquireMagickMemory(sizeof(*iterator));
439 if (iterator == (PixelIterator *) NULL)
440 ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
442 (void) ResetMagickMemory(iterator,0,sizeof(*iterator));
443 iterator->id=AcquireWandId();
444 (void) FormatLocaleString(iterator->name,MaxTextExtent,"%s-%.20g",
445 PixelIteratorId,(double) iterator->id);
446 iterator->exception=AcquireExceptionInfo();
448 SetGeometry(image,&iterator->region);
449 iterator->region.width=width;
450 iterator->region.height=height;
451 iterator->region.x=x;
452 iterator->region.y=y;
453 iterator->pixel_wands=NewPixelWands(iterator->region.width);
455 iterator->debug=IsEventLogging();
456 if (iterator->debug != MagickFalse)
457 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
458 iterator->signature=WandSignature;
463 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
467 % P i x e l G e t C u r r e n t I t e r a t o r R o w %
471 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
473 % PixelGetCurrentIteratorRow() returns the current row as an array of pixel
474 % wands from the pixel iterator.
476 % The format of the PixelGetCurrentIteratorRow method is:
478 % PixelWand **PixelGetCurrentIteratorRow(PixelIterator *iterator,
479 % size_t *number_wands)
481 % A description of each parameter follows:
483 % o iterator: the pixel iterator.
485 % o number_wands: the number of pixel wands.
488 WandExport PixelWand **PixelGetCurrentIteratorRow(PixelIterator *iterator,
489 size_t *number_wands)
491 register const Quantum
497 assert(iterator != (PixelIterator *) NULL);
498 assert(iterator->signature == WandSignature);
499 if (iterator->debug != MagickFalse)
500 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
502 iterator->active=MagickTrue;
503 pixels=GetCacheViewVirtualPixels(iterator->view,iterator->region.x,
504 iterator->region.y+iterator->y,iterator->region.width,1,
505 iterator->exception);
506 if (pixels == (const Quantum *) NULL)
508 InheritException(iterator->exception,GetCacheViewException(
510 return((PixelWand **) NULL);
512 for (x=0; x < (ssize_t) iterator->region.width; x++)
514 PixelSetQuantumPixel(iterator->image,pixels,iterator->pixel_wands[x]);
515 pixels+=GetPixelChannels(iterator->image);
517 *number_wands=iterator->region.width;
518 return(iterator->pixel_wands);
522 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
526 % P i x e l G e t I t e r a t o r E x c e p t i o n %
530 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
532 % PixelGetIteratorException() returns the severity, reason, and description of
533 % any error that occurs when using other methods in this API.
535 % The format of the PixelGetIteratorException method is:
537 % char *PixelGetIteratorException(const Pixeliterator *iterator,
538 % ExceptionType *severity)
540 % A description of each parameter follows:
542 % o iterator: the pixel iterator.
544 % o severity: the severity of the error is returned here.
547 WandExport char *PixelGetIteratorException(const PixelIterator *iterator,
548 ExceptionType *severity)
553 assert(iterator != (const PixelIterator *) NULL);
554 assert(iterator->signature == WandSignature);
555 if (iterator->debug != MagickFalse)
556 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
557 assert(severity != (ExceptionType *) NULL);
558 *severity=iterator->exception->severity;
559 description=(char *) AcquireQuantumMemory(2UL*MaxTextExtent,
560 sizeof(*description));
561 if (description == (char *) NULL)
562 ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
565 if (iterator->exception->reason != (char *) NULL)
566 (void) CopyMagickString(description,GetLocaleExceptionMessage(
567 iterator->exception->severity,iterator->exception->reason),MaxTextExtent);
568 if (iterator->exception->description != (char *) NULL)
570 (void) ConcatenateMagickString(description," (",MaxTextExtent);
571 (void) ConcatenateMagickString(description,GetLocaleExceptionMessage(
572 iterator->exception->severity,iterator->exception->description),
574 (void) ConcatenateMagickString(description,")",MaxTextExtent);
580 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
584 % P i x e l G e t E x c e p t i o n T y p e %
588 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
590 % PixelGetIteratorExceptionType() the exception type associated with the wand.
591 % If no exception has occurred, UndefinedExceptionType is returned.
593 % The format of the PixelGetIteratorExceptionType method is:
595 % ExceptionType PixelGetIteratorExceptionType(const PixelWand *wand)
597 % A description of each parameter follows:
599 % o wand: the magick wand.
602 WandExport ExceptionType PixelGetIteratorExceptionType(
603 const PixelIterator *wand)
605 assert(wand != (const PixelIterator *) NULL);
606 assert(wand->signature == WandSignature);
607 if (wand->debug != MagickFalse)
608 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
609 return(wand->exception->severity);
613 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
617 % P i x e l G e t I t e r a t o r R o w %
621 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
623 % PixelGetIteratorRow() returns the current pixel iterator row.
625 % The format of the PixelGetIteratorRow method is:
627 % MagickBooleanType PixelGetIteratorRow(PixelIterator *iterator)
629 % A description of each parameter follows:
631 % o iterator: the pixel iterator.
634 WandExport ssize_t PixelGetIteratorRow(PixelIterator *iterator)
636 assert(iterator != (const PixelIterator *) NULL);
637 assert(iterator->signature == WandSignature);
638 if (iterator->debug != MagickFalse)
639 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
644 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
648 % P i x e l G e t N e x t I t e r a t o r R o w %
652 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
654 % PixelGetNextIteratorRow() returns the next row as an array of pixel wands
655 % from the pixel iterator.
657 % The format of the PixelGetNextIteratorRow method is:
659 % PixelWand **PixelGetNextIteratorRow(PixelIterator *iterator,
660 % size_t *number_wands)
662 % A description of each parameter follows:
664 % o iterator: the pixel iterator.
666 % o number_wands: the number of pixel wands.
669 WandExport PixelWand **PixelGetNextIteratorRow(PixelIterator *iterator,
670 size_t *number_wands)
672 register const Quantum
678 assert(iterator != (PixelIterator *) NULL);
679 assert(iterator->signature == WandSignature);
680 if (iterator->debug != MagickFalse)
681 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
683 if (iterator->active != MagickFalse)
685 if (PixelSetIteratorRow(iterator,iterator->y) == MagickFalse)
686 return((PixelWand **) NULL);
687 pixels=GetCacheViewVirtualPixels(iterator->view,iterator->region.x,
688 iterator->region.y+iterator->y,iterator->region.width,1,
689 iterator->exception);
690 if (pixels == (const Quantum *) NULL)
692 InheritException(iterator->exception,GetCacheViewException(
694 return((PixelWand **) NULL);
696 for (x=0; x < (ssize_t) iterator->region.width; x++)
698 PixelSetQuantumPixel(iterator->image,pixels,iterator->pixel_wands[x]);
699 pixels+=GetPixelChannels(iterator->image);
701 *number_wands=iterator->region.width;
702 return(iterator->pixel_wands);
706 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
710 % P i x e l G e t P r e v i o u s I t e r a t o r R o w %
714 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
716 % PixelGetPreviousIteratorRow() returns the previous row as an array of pixel
717 % wands from the pixel iterator.
719 % The format of the PixelGetPreviousIteratorRow method is:
721 % PixelWand **PixelGetPreviousIteratorRow(PixelIterator *iterator,
722 % size_t *number_wands)
724 % A description of each parameter follows:
726 % o iterator: the pixel iterator.
728 % o number_wands: the number of pixel wands.
732 WandExport PixelWand **PixelGetPreviousRow(PixelIterator *iterator)
737 return(PixelGetPreviousIteratorRow(iterator,&number_wands));
740 WandExport PixelWand **PixelGetPreviousIteratorRow(PixelIterator *iterator,
741 size_t *number_wands)
743 register const Quantum
749 assert(iterator != (PixelIterator *) NULL);
750 assert(iterator->signature == WandSignature);
751 if (iterator->debug != MagickFalse)
752 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
754 if (iterator->active != MagickFalse)
756 if (PixelSetIteratorRow(iterator,iterator->y) == MagickFalse)
757 return((PixelWand **) NULL);
758 pixels=GetCacheViewVirtualPixels(iterator->view,iterator->region.x,
759 iterator->region.y+iterator->y,iterator->region.width,1,
760 iterator->exception);
761 if (pixels == (const Quantum *) NULL)
763 InheritException(iterator->exception,GetCacheViewException(
765 return((PixelWand **) NULL);
767 for (x=0; x < (ssize_t) iterator->region.width; x++)
769 PixelSetQuantumPixel(iterator->image,pixels,iterator->pixel_wands[x]);
770 pixels+=GetPixelChannels(iterator->image);
772 *number_wands=iterator->region.width;
773 return(iterator->pixel_wands);
777 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
781 % P i x e l R e s e t I t e r a t o r %
785 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
787 % PixelResetIterator() resets the pixel iterator. Use it in conjunction
788 % with PixelGetNextIteratorRow() to iterate over all the pixels in a pixel
791 % The format of the PixelResetIterator method is:
793 % void PixelResetIterator(PixelIterator *iterator)
795 % A description of each parameter follows:
797 % o iterator: the pixel iterator.
800 WandExport void PixelResetIterator(PixelIterator *iterator)
802 assert(iterator != (PixelIterator *) NULL);
803 assert(iterator->signature == WandSignature);
804 if (iterator->debug != MagickFalse)
805 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
806 iterator->active=MagickFalse;
811 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
815 % P i x e l S e t F i r s t I t e r a t o r R o w %
819 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
821 % PixelSetFirstIteratorRow() sets the pixel iterator to the first pixel row.
823 % The format of the PixelSetFirstIteratorRow method is:
825 % void PixelSetFirstIteratorRow(PixelIterator *iterator)
827 % A description of each parameter follows:
829 % o iterator: the magick iterator.
832 WandExport void PixelSetFirstIteratorRow(PixelIterator *iterator)
834 assert(iterator != (PixelIterator *) NULL);
835 assert(iterator->signature == WandSignature);
836 if (iterator->debug != MagickFalse)
837 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
838 iterator->active=MagickFalse;
839 iterator->y=iterator->region.y;
843 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
847 % P i x e l S e t I t e r a t o r R o w %
851 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
853 % PixelSetIteratorRow() set the pixel iterator row.
855 % The format of the PixelSetIteratorRow method is:
857 % MagickBooleanType PixelSetIteratorRow(PixelIterator *iterator,
860 % A description of each parameter follows:
862 % o iterator: the pixel iterator.
865 WandExport MagickBooleanType PixelSetIteratorRow(PixelIterator *iterator,
868 assert(iterator != (const PixelIterator *) NULL);
869 assert(iterator->signature == WandSignature);
870 if (iterator->debug != MagickFalse)
871 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
872 if ((row < 0) || (row >= (ssize_t) iterator->region.height))
874 iterator->active=MagickTrue;
880 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
884 % P i x e l S e t L a s t I t e r a t o r R o w %
888 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
890 % PixelSetLastIteratorRow() sets the pixel iterator to the last pixel row.
892 % The format of the PixelSetLastIteratorRow method is:
894 % void PixelSetLastIteratorRow(PixelIterator *iterator)
896 % A description of each parameter follows:
898 % o iterator: the magick iterator.
901 WandExport void PixelSetLastIteratorRow(PixelIterator *iterator)
903 assert(iterator != (PixelIterator *) NULL);
904 assert(iterator->signature == WandSignature);
905 if (iterator->debug != MagickFalse)
906 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
907 iterator->active=MagickFalse;
908 iterator->y=(ssize_t) iterator->region.height-1;
912 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
916 % P i x e l S y n c I t e r a t o r %
920 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
922 % PixelSyncIterator() syncs the pixel iterator.
924 % The format of the PixelSyncIterator method is:
926 % MagickBooleanType PixelSyncIterator(PixelIterator *iterator)
928 % A description of each parameter follows:
930 % o iterator: the pixel iterator.
933 WandExport MagickBooleanType PixelSyncIterator(PixelIterator *iterator)
944 assert(iterator != (const PixelIterator *) NULL);
945 assert(iterator->signature == WandSignature);
946 if (iterator->debug != MagickFalse)
947 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",iterator->name);
948 if (SetCacheViewStorageClass(iterator->view,DirectClass) == MagickFalse)
950 exception=iterator->exception;
951 pixels=GetCacheViewAuthenticPixels(iterator->view,iterator->region.x,
952 iterator->region.y+iterator->y,iterator->region.width,1,exception);
953 if (pixels == (Quantum *) NULL)
955 InheritException(iterator->exception,GetCacheViewException(
959 for (x=0; x < (ssize_t) iterator->region.width; x++)
961 PixelGetQuantumPixel(iterator->image,iterator->pixel_wands[x],pixels);
962 pixels+=GetPixelChannels(iterator->image);
964 if (SyncCacheViewAuthenticPixels(iterator->view,exception) == MagickFalse)
966 InheritException(iterator->exception,GetCacheViewException(