From ee31ab817eb24bacd620bcf00652ca0e8cf5f47a Mon Sep 17 00:00:00 2001 From: cristy Date: Mon, 6 Oct 2014 11:35:27 +0000 Subject: [PATCH] --- MagickCore/effect.c | 106 ++++++++++++++++++++---------------------- MagickCore/geometry.h | 4 +- 2 files changed, 52 insertions(+), 58 deletions(-) diff --git a/MagickCore/effect.c b/MagickCore/effect.c index ddacaf5e2..7207caf88 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -1436,7 +1436,7 @@ MagickExport Image *KuwaharaImage(const Image *image,const double radius, #define KuwaharaImageTag "Kuwahara/Image" CacheView - *image_view[4], + *image_view, *kuwahara_view; Image @@ -1449,9 +1449,6 @@ MagickExport Image *KuwaharaImage(const Image *image,const double radius, MagickOffsetType progress; - register ssize_t - i; - size_t width; @@ -1489,8 +1486,7 @@ MagickExport Image *KuwaharaImage(const Image *image,const double radius, */ status=MagickTrue; progress=0; - for (i=0; i < 4; i++) - image_view[i]=AcquireVirtualCacheView(gaussian_image,exception); + image_view=AcquireVirtualCacheView(gaussian_image,exception); kuwahara_view=AcquireAuthenticCacheView(kuwahara_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ @@ -1516,89 +1512,84 @@ MagickExport Image *KuwaharaImage(const Image *image,const double radius, for (x=0; x < (ssize_t) image->columns; x++) { const Quantum - *restrict p[4]; + *restrict p; double min_variance; - ssize_t - j, - l; - RectangleInfo - quadrant[4]; + quadrant, + target; + + register size_t + i; + min_variance=MagickMaximumValue; + SetGeometry(gaussian_image,&target); + quadrant.width=width; + quadrant.height=width; for (i=0; i < 4; i++) { - quadrant[i].width=width; - quadrant[i].height=width; - quadrant[i].x=x; - quadrant[i].y=y; + const Quantum + *restrict k; + + double + mean[MaxPixelChannels], + variance; + + register ssize_t + n; + + ssize_t + j; + + quadrant.x=x; + quadrant.y=y; switch (i) { case 0: { - quadrant[i].x=x-(ssize_t) (width-1); - quadrant[i].y=y-(ssize_t) (width-1); + quadrant.x=x-(ssize_t) (width-1); + quadrant.y=y-(ssize_t) (width-1); break; } case 1: { - quadrant[i].y=y-(ssize_t) (width-1); + quadrant.y=y-(ssize_t) (width-1); break; } case 2: { - quadrant[i].x=x-(ssize_t) (width-1); + quadrant.x=x-(ssize_t) (width-1); break; } case 3: default: break; } - p[i]=GetCacheViewVirtualPixels(image_view[i],quadrant[i].x, - quadrant[i].y,quadrant[i].width,quadrant[i].height,exception); - if (p[i] == (const Quantum *) NULL) - break; - } - if (i < 4) - { - status=MagickFalse; + p=GetCacheViewVirtualPixels(image_view,quadrant.x,quadrant.y, + quadrant.width,quadrant.height,exception); + if (p == (const Quantum *) NULL) break; - } - min_variance=MagickMaximumValue; - l=0; - for (i=0; i < 4; i++) - { - const Quantum - *restrict k; - - double - mean[MaxPixelChannels], - variance; - - ssize_t - n; - - for (j=0; j < (ssize_t) GetPixelChannels(image); j++) + for (j=0; j < (ssize_t) GetPixelChannels(gaussian_image); j++) mean[j]=0.0; - k=p[i]; + k=p; for (n=0; n < (ssize_t) (width*width); n++) { - for (j=0; j < (ssize_t) GetPixelChannels(image); j++) + for (j=0; j < (ssize_t) GetPixelChannels(gaussian_image); j++) mean[j]+=(double) k[j]; k+=GetPixelChannels(image); } - for (j=0; j < (ssize_t) GetPixelChannels(image); j++) + for (j=0; j < (ssize_t) GetPixelChannels(gaussian_image); j++) mean[j]/=(double) (width*width); - k=p[i]; + k=p; variance=0.0; for (n=0; n < (ssize_t) (width*width); n++) { double luma; - luma=GetPixelLuma(image,k); + luma=GetPixelLuma(gaussian_image,k); variance+=(luma-GetMeanLuma(gaussian_image,mean))* (luma-GetMeanLuma(gaussian_image,mean)); k+=GetPixelChannels(image); @@ -1606,13 +1597,17 @@ MagickExport Image *KuwaharaImage(const Image *image,const double radius, if (variance < min_variance) { min_variance=variance; - l=i; + target=quadrant; } } - status=InterpolatePixelChannels(gaussian_image,image_view[0], - kuwahara_image,UndefinedInterpolatePixel,(double) quadrant[l].x+ - quadrant[l].width/2.0,(double) quadrant[l].y+quadrant[l].height/2.0,q, - exception); + if (i < 4) + { + status=MagickFalse; + break; + } + status=InterpolatePixelChannels(gaussian_image,image_view,kuwahara_image, + UndefinedInterpolatePixel,(double) target.x+target.width/2.0,(double) + target.y+target.height/2.0,q,exception); q+=GetPixelChannels(kuwahara_image); } if (SyncCacheViewAuthenticPixels(kuwahara_view,exception) == MagickFalse) @@ -1631,8 +1626,7 @@ MagickExport Image *KuwaharaImage(const Image *image,const double radius, } } kuwahara_view=DestroyCacheView(kuwahara_view); - for (i=0; i < 4; i++) - image_view[i]=DestroyCacheView(image_view[i]); + image_view=DestroyCacheView(image_view); gaussian_image=DestroyImage(gaussian_image); if (status == MagickFalse) kuwahara_image=DestroyImage(kuwahara_image); diff --git a/MagickCore/geometry.h b/MagickCore/geometry.h index 2944490a7..e19f95444 100644 --- a/MagickCore/geometry.h +++ b/MagickCore/geometry.h @@ -154,8 +154,8 @@ extern MagickExport MagickStatusType ExceptionInfo *); extern MagickExport void - GravityAdjustGeometry(const size_t,const size_t, - const GravityType,RectangleInfo *), + GravityAdjustGeometry(const size_t,const size_t,const GravityType, + RectangleInfo *), SetGeometry(const Image *,RectangleInfo *), SetGeometryInfo(GeometryInfo *); -- 2.50.1