49#include "wand/studio.h"
50#include "wand/MagickWand.h"
51#include "wand/magick-wand-private.h"
52#include "wand/pixel-iterator.h"
53#include "wand/pixel-wand.h"
59#define PixelIteratorId "PixelIterator"
122 assert(iterator->signature == WandSignature);
123 if (iterator->debug != MagickFalse)
124 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
125 iterator->pixel_wands=DestroyPixelWands(iterator->pixel_wands,
126 iterator->region.width);
127 ClearMagickException(iterator->exception);
128 iterator->pixel_wands=NewPixelWands(iterator->region.width);
129 iterator->active=MagickFalse;
131 iterator->debug=IsEventLogging();
162 assert(iterator->signature == WandSignature);
163 if (iterator->debug != MagickFalse)
164 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
166 sizeof(*clone_iterator));
167 (void) memset(clone_iterator,0,
sizeof(*clone_iterator));
168 clone_iterator->id=AcquireWandId();
169 (void) FormatLocaleString(clone_iterator->name,MaxTextExtent,
"%s-%.20g",
170 PixelIteratorId,(
double) clone_iterator->id);
171 clone_iterator->exception=AcquireExceptionInfo();
172 InheritException(clone_iterator->exception,iterator->exception);
173 clone_iterator->view=CloneCacheView(iterator->view);
174 clone_iterator->region=iterator->region;
175 clone_iterator->active=iterator->active;
176 clone_iterator->y=iterator->y;
177 clone_iterator->pixel_wands=ClonePixelWands((
const PixelWand **)
178 iterator->pixel_wands,iterator->region.width);
179 clone_iterator->debug=iterator->debug;
180 if (clone_iterator->debug != MagickFalse)
181 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",
182 clone_iterator->name);
183 clone_iterator->signature=WandSignature;
184 return(clone_iterator);
212 assert(iterator->signature == WandSignature);
213 if (iterator->debug != MagickFalse)
214 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
215 iterator->view=DestroyCacheView(iterator->view);
216 iterator->pixel_wands=DestroyPixelWands(iterator->pixel_wands,
217 iterator->region.width);
218 iterator->exception=DestroyExceptionInfo(iterator->exception);
219 iterator->signature=(~WandSignature);
220 RelinquishWandId(iterator->id);
248WandExport MagickBooleanType IsPixelIterator(
const PixelIterator *iterator)
255 if (iterator->signature != WandSignature)
257 length=strlen(PixelIteratorId);
258 if (LocaleNCompare(iterator->name,PixelIteratorId,length) != 0)
305 depth=MAGICKCORE_QUANTUM_DEPTH;
306 quantum=GetMagickQuantumDepth(&depth);
307 if (depth != MAGICKCORE_QUANTUM_DEPTH)
308 ThrowWandFatalException(WandError,
"QuantumDepthMismatch",quantum);
310 image=GetImageFromMagickWand(wand);
311 if (image == (Image *) NULL)
313 exception=AcquireExceptionInfo();
314 view=AcquireVirtualCacheView(image,exception);
315 if (view == (CacheView *) NULL)
317 iterator=(
PixelIterator *) AcquireCriticalMemory(
sizeof(*iterator));
318 (void) memset(iterator,0,
sizeof(*iterator));
319 iterator->id=AcquireWandId();
320 (void) FormatLocaleString(iterator->name,MaxTextExtent,
"%s-%.20g",
321 PixelIteratorId,(
double) iterator->id);
322 iterator->exception=exception;
324 SetGeometry(image,&iterator->region);
325 iterator->region.width=image->columns;
326 iterator->region.height=image->rows;
327 iterator->region.x=0;
328 iterator->region.y=0;
329 iterator->pixel_wands=NewPixelWands(iterator->region.width);
331 iterator->debug=IsEventLogging();
332 if (iterator->debug != MagickFalse)
333 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
334 iterator->signature=WandSignature;
361WandExport MagickBooleanType PixelClearIteratorException(
365 assert(iterator->signature == WandSignature);
366 if (iterator->debug != MagickFalse)
367 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
368 ClearMagickException(iterator->exception);
399 const ssize_t x,
const ssize_t y,
const size_t width,
const size_t height)
420 depth=MAGICKCORE_QUANTUM_DEPTH;
421 quantum=GetMagickQuantumDepth(&depth);
422 if (depth != MAGICKCORE_QUANTUM_DEPTH)
423 ThrowWandFatalException(WandError,
"QuantumDepthMismatch",quantum);
424 if ((width == 0) || (height == 0))
425 ThrowWandFatalException(WandError,
"ZeroRegionSize",quantum);
426 image=GetImageFromMagickWand(wand);
427 if (image == (Image *) NULL)
429 exception=AcquireExceptionInfo();
430 view=AcquireVirtualCacheView(image,exception);
431 if (view == (CacheView *) NULL)
433 iterator=(
PixelIterator *) AcquireCriticalMemory(
sizeof(*iterator));
434 (void) memset(iterator,0,
sizeof(*iterator));
435 iterator->id=AcquireWandId();
436 (void) FormatLocaleString(iterator->name,MaxTextExtent,
"%s-%.20g",
437 PixelIteratorId,(
double) iterator->id);
438 iterator->exception=exception;
440 SetGeometry(image,&iterator->region);
441 iterator->region.width=width;
442 iterator->region.height=height;
443 iterator->region.x=x;
444 iterator->region.y=y;
445 iterator->pixel_wands=NewPixelWands(iterator->region.width);
447 iterator->debug=IsEventLogging();
448 if (iterator->debug != MagickFalse)
449 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
450 iterator->signature=WandSignature;
481 size_t *number_wands)
493 assert(iterator->signature == WandSignature);
494 if (iterator->debug != MagickFalse)
495 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
497 iterator->active=MagickTrue;
498 pixels=GetCacheViewVirtualPixels(iterator->view,iterator->region.x,
499 iterator->region.y+iterator->y,iterator->region.width,1,
500 iterator->exception);
501 if (pixels == (
const PixelPacket *) NULL)
503 InheritException(iterator->exception,GetCacheViewException(
507 indexes=GetCacheViewVirtualIndexQueue(iterator->view);
508 for (x=0; x < (ssize_t) iterator->region.width; x++)
509 PixelSetQuantumColor(iterator->pixel_wands[x],pixels+x);
510 if (GetCacheViewColorspace(iterator->view) == CMYKColorspace)
511 for (x=0; x < (ssize_t) iterator->region.width; x++)
512 PixelSetBlackQuantum(iterator->pixel_wands[x],
513 GetPixelBlack(indexes+x));
514 if (GetCacheViewStorageClass(iterator->view) == PseudoClass)
515 for (x=0; x < (ssize_t) iterator->region.width; x++)
516 PixelSetIndex(iterator->pixel_wands[x],
517 GetPixelBlack(indexes+x));
518 *number_wands=iterator->region.width;
519 return(iterator->pixel_wands);
548WandExport
char *PixelGetIteratorException(
const PixelIterator *iterator,
549 ExceptionType *severity)
555 assert(iterator->signature == WandSignature);
556 if (iterator->debug != MagickFalse)
557 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
558 assert(severity != (ExceptionType *) NULL);
559 *severity=iterator->exception->severity;
560 description=(
char *) AcquireQuantumMemory(2UL*MaxTextExtent,
561 sizeof(*description));
562 if (description == (
char *) NULL)
563 ThrowWandFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed",
566 if (iterator->exception->reason != (
char *) NULL)
567 (void) CopyMagickString(description,GetLocaleExceptionMessage(
568 iterator->exception->severity,iterator->exception->reason),MaxTextExtent);
569 if (iterator->exception->description != (
char *) NULL)
571 (void) ConcatenateMagickString(description,
" (",MaxTextExtent);
572 (void) ConcatenateMagickString(description,GetLocaleExceptionMessage(
573 iterator->exception->severity,iterator->exception->description),
575 (void) ConcatenateMagickString(description,
")",MaxTextExtent);
604WandExport ExceptionType PixelGetIteratorExceptionType(
608 assert(iterator->signature == WandSignature);
609 if (iterator->debug != MagickFalse)
610 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
611 return(iterator->exception->severity);
636WandExport ssize_t PixelGetIteratorRow(
PixelIterator *iterator)
639 assert(iterator->signature == WandSignature);
640 if (iterator->debug != MagickFalse)
641 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
672 size_t *number_wands)
684 assert(iterator->signature == WandSignature);
685 if (iterator->debug != MagickFalse)
686 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
688 if (iterator->active != MagickFalse)
690 if (PixelSetIteratorRow(iterator,iterator->y) == MagickFalse)
692 pixels=GetCacheViewVirtualPixels(iterator->view,iterator->region.x,
693 iterator->region.y+iterator->y,iterator->region.width,1,
694 iterator->exception);
695 if (pixels == (
const PixelPacket *) NULL)
697 InheritException(iterator->exception,GetCacheViewException(
701 indexes=GetCacheViewVirtualIndexQueue(iterator->view);
702 for (x=0; x < (ssize_t) iterator->region.width; x++)
703 PixelSetQuantumColor(iterator->pixel_wands[x],pixels+x);
704 if (GetCacheViewColorspace(iterator->view) == CMYKColorspace)
705 for (x=0; x < (ssize_t) iterator->region.width; x++)
706 PixelSetBlackQuantum(iterator->pixel_wands[x],
707 GetPixelBlack(indexes+x));
708 if (GetCacheViewStorageClass(iterator->view) == PseudoClass)
709 for (x=0; x < (ssize_t) iterator->region.width; x++)
710 PixelSetIndex(iterator->pixel_wands[x],
711 GetPixelIndex(indexes+x));
712 *number_wands=iterator->region.width;
713 return(iterator->pixel_wands);
748 return(PixelGetPreviousIteratorRow(iterator,&number_wands));
752 size_t *number_wands)
764 assert(iterator->signature == WandSignature);
765 if (iterator->debug != MagickFalse)
766 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
768 if (iterator->active != MagickFalse)
770 if (PixelSetIteratorRow(iterator,iterator->y) == MagickFalse)
772 pixels=GetCacheViewVirtualPixels(iterator->view,iterator->region.x,
773 iterator->region.y+iterator->y,iterator->region.width,1,
774 iterator->exception);
775 if (pixels == (
const PixelPacket *) NULL)
777 InheritException(iterator->exception,GetCacheViewException(
781 indexes=GetCacheViewVirtualIndexQueue(iterator->view);
782 for (x=0; x < (ssize_t) iterator->region.width; x++)
783 PixelSetQuantumColor(iterator->pixel_wands[x],pixels+x);
784 if (GetCacheViewColorspace(iterator->view) == CMYKColorspace)
785 for (x=0; x < (ssize_t) iterator->region.width; x++)
786 PixelSetBlackQuantum(iterator->pixel_wands[x],
787 GetPixelBlack(indexes+x));
788 if (GetCacheViewStorageClass(iterator->view) == PseudoClass)
789 for (x=0; x < (ssize_t) iterator->region.width; x++)
790 PixelSetIndex(iterator->pixel_wands[x],
791 GetPixelIndex(indexes+x));
792 *number_wands=iterator->region.width;
793 return(iterator->pixel_wands);
823 assert(iterator->signature == WandSignature);
824 if (iterator->debug != MagickFalse)
825 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
826 iterator->active=MagickFalse;
852WandExport
void PixelSetFirstIteratorRow(
PixelIterator *iterator)
855 assert(iterator->signature == WandSignature);
856 if (iterator->debug != MagickFalse)
857 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
858 iterator->active=MagickFalse;
859 iterator->y=iterator->region.y;
885WandExport MagickBooleanType PixelSetIteratorRow(
PixelIterator *iterator,
889 assert(iterator->signature == WandSignature);
890 if (iterator->debug != MagickFalse)
891 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
892 if ((row < 0) || (row >= (ssize_t) iterator->region.height))
894 iterator->active=MagickTrue;
921WandExport
void PixelSetLastIteratorRow(
PixelIterator *iterator)
924 assert(iterator->signature == WandSignature);
925 if (iterator->debug != MagickFalse)
926 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
927 iterator->active=MagickFalse;
928 iterator->y=(ssize_t) iterator->region.height-1;
953WandExport MagickBooleanType PixelSyncIterator(
PixelIterator *iterator)
959 *magick_restrict indexes;
965 *magick_restrict pixels;
968 assert(iterator->signature == WandSignature);
969 if (iterator->debug != MagickFalse)
970 (void) LogMagickEvent(WandEvent,GetMagickModule(),
"%s",iterator->name);
971 if (SetCacheViewStorageClass(iterator->view,DirectClass) == MagickFalse)
973 exception=iterator->exception;
974 pixels=GetCacheViewAuthenticPixels(iterator->view,iterator->region.x,
975 iterator->region.y+iterator->y,iterator->region.width,1,exception);
976 if (pixels == (PixelPacket *) NULL)
978 InheritException(iterator->exception,GetCacheViewException(
982 indexes=GetCacheViewAuthenticIndexQueue(iterator->view);
983 for (x=0; x < (ssize_t) iterator->region.width; x++)
984 PixelGetQuantumColor(iterator->pixel_wands[x],pixels+x);
985 if (GetCacheViewColorspace(iterator->view) == CMYKColorspace)
986 for (x=0; x < (ssize_t) iterator->region.width; x++)
987 SetPixelBlack(indexes+x,PixelGetBlackQuantum(
988 iterator->pixel_wands[x]));
989 if (SyncCacheViewAuthenticPixels(iterator->view,exception) == MagickFalse)
991 InheritException(iterator->exception,GetCacheViewException(