diff options
Diffstat (limited to 'MagickCore/pixel.c')
-rw-r--r-- | MagickCore/pixel.c | 128 |
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); +} |