summaryrefslogtreecommitdiff
path: root/MagickCore/pixel.c
diff options
context:
space:
mode:
Diffstat (limited to 'MagickCore/pixel.c')
-rw-r--r--MagickCore/pixel.c128
1 files changed, 126 insertions, 2 deletions
diff --git a/MagickCore/pixel.c b/MagickCore/pixel.c
index 9c5254954..5c1c5296f 100644
--- a/MagickCore/pixel.c
+++ b/MagickCore/pixel.c
@@ -4759,7 +4759,7 @@ MagickExport MagickBooleanType InterpolatePixelChannel(
GetPixelLuma(image,p+3*GetPixelChannels(image));
luminance.y=GetPixelLuma(image,p+GetPixelChannels(image))-(double)
GetPixelLuma(image,p+2*GetPixelChannels(image));
- if (fabs(luminance.x) < fabs(luminance.y))
+ if (fabs((double) luminance.x) < fabs((double) luminance.y))
{
/*
Diagonal 0-3 NW-SE.
@@ -5747,7 +5747,7 @@ MagickExport MagickBooleanType InterpolatePixelInfo(const Image *image,
AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
- if (fabs(luminance.x) < fabs(luminance.y))
+ if (fabs((double) luminance.x) < fabs((double) luminance.y))
{
/*
Diagonal 0-3 NW-SE.
@@ -6359,3 +6359,127 @@ MagickExport MagickBooleanType SetPixelMetaChannels(Image *image,
InitializePixelChannelMap(image);
return(SyncImagePixelCache(image,exception));
}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S o r t I m a g e P i x e l s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SortImagePixels() sorts pixels within each scanline in ascending order of
+% intensity.
+%
+% The format of the SortImagePixels method is:
+%
+% MagickBooleanType SortImagePixels(Image *image,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport MagickBooleanType SortImagePixels(Image *image,
+ ExceptionInfo *exception)
+{
+#define SolarizeImageTag "Solarize/Image"
+
+ CacheView
+ *image_view;
+
+ MagickBooleanType
+ status;
+
+ MagickOffsetType
+ progress;
+
+ ssize_t
+ y;
+
+ /*
+ Sort image pixels.
+ */
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickCoreSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ status=MagickTrue;
+ progress=0;
+ image_view=AcquireAuthenticCacheView(image,exception);
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+ #pragma omp parallel for schedule(static) shared(progress,status) \
+ magick_number_threads(image,image,image->rows,1)
+#endif
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ Quantum
+ *magick_restrict q;
+
+ ssize_t
+ x;
+
+ if (status == MagickFalse)
+ continue;
+ q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
+ if (q == (Quantum *) NULL)
+ {
+ status=MagickFalse;
+ continue;
+ }
+ for (x=0; x < (ssize_t) image->columns-1; x++)
+ {
+ MagickRealType
+ current,
+ previous;
+
+ ssize_t
+ j;
+
+ previous=GetPixelIntensity(image,q);
+ for (j=0; j < (ssize_t) (image->columns-x-1); j++)
+ {
+ current=GetPixelIntensity(image,q+(j+1)*GetPixelChannels(image));
+ if (previous > current)
+ {
+ Quantum
+ pixel[MaxPixelChannels];
+
+ /*
+ Swap adjacent pixels.
+ */
+ (void) memcpy(pixel,q+j*GetPixelChannels(image),
+ GetPixelChannels(image)*sizeof(Quantum));
+ (void) memcpy(q+j*GetPixelChannels(image),q+(j+1)*
+ GetPixelChannels(image),GetPixelChannels(image)*sizeof(Quantum));
+ (void) memcpy(q+(j+1)*GetPixelChannels(image),pixel,
+ GetPixelChannels(image)*sizeof(Quantum));
+ }
+ else
+ previous=current;
+ }
+ }
+ if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
+ status=MagickFalse;
+ if (image->progress_monitor != (MagickProgressMonitor) NULL)
+ {
+ MagickBooleanType
+ proceed;
+
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+ #pragma omp atomic
+#endif
+ progress++;
+ proceed=SetImageProgress(image,SolarizeImageTag,progress,image->rows);
+ if (proceed == MagickFalse)
+ status=MagickFalse;
+ }
+ }
+ image_view=DestroyCacheView(image_view);
+ return(status);
+}