]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Mon, 5 Sep 2011 17:29:53 +0000 (17:29 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Mon, 5 Sep 2011 17:29:53 +0000 (17:29 +0000)
13 files changed:
Magick++/lib/Image.cpp
Magick++/lib/Magick++/Image.h
Magick++/lib/Magick++/STL.h
Magick++/lib/STL.cpp
MagickCore/display.c
MagickCore/effect.c
MagickCore/effect.h
MagickCore/fx.c
MagickWand/magick-image.c
MagickWand/magick-image.h
MagickWand/mogrify.c
PerlMagick/Magick.xs
coders/msl.c

index 05fb5c6c2a98d4d800230c7da179c2877817a06d..d2cf163cd822f0e690197d634815b84a094854b5 100644 (file)
@@ -864,12 +864,22 @@ void Magick::Image::draw ( const std::list<Magick::Drawable> &drawable_ )
 }
 
 // Hilight edges in image
-void Magick::Image::edge ( const double radius_ )
+void Magick::Image::edge ( const double radius_)
 {
   ExceptionInfo exceptionInfo;
   GetExceptionInfo( &exceptionInfo );
   MagickCore::Image* newImage =
-    EdgeImage( image(), radius_, &exceptionInfo );
+    EdgeImage( image(), radius_, 1.0, &exceptionInfo );
+  replaceImage( newImage );
+  throwException( exceptionInfo );
+  (void) DestroyExceptionInfo( &exceptionInfo );
+}
+void Magick::Image::edge ( const double radius_, const double sigma_ )
+{
+  ExceptionInfo exceptionInfo;
+  GetExceptionInfo( &exceptionInfo );
+  MagickCore::Image* newImage =
+    EdgeImage( image(), radius_, sigma_, &exceptionInfo );
   replaceImage( newImage );
   throwException( exceptionInfo );
   (void) DestroyExceptionInfo( &exceptionInfo );
index 8d3986fb7693655cbebe43fc4fa2c2f275e83d63..dd0397c36b871421d26af1ba99cb380b09c4743d 100644 (file)
@@ -284,6 +284,8 @@ namespace Magick
     
     // Edge image (hilight edges in image)
     void            edge ( const double radius_ = 0.0 );
+    void            edge ( const double radius_ = 0.0,
+                           const double sigma_ = 1.0);
     
     // Emboss image (hilight edges with 3D effect)
     // The radius_ parameter specifies the radius of the Gaussian, in
index 2c3074ee3dd1a2abeb8604fd234f7faa7130ac5f..df6c43a79679d4dc2738670d72ac97f528eebf0f 100644 (file)
@@ -389,12 +389,13 @@ namespace Magick
   class MagickDLLDecl edgeImage : public std::unary_function<Image&,void>
   {
   public:
-    edgeImage( const double radius_ = 0.0  );
+    edgeImage( const double radius_ = 0.0, const double sigma_ = 0.5  );
 
     void operator()( Image &image_ ) const;
 
   private:
     double _radius;
+    double _sigma;
   };
 
   // Emboss image (hilight edges with 3D effect)
index fdeee8a0300e51f68fbd6189a26d2bc6c0336540..0a79fcc7f4f10136930ad45637b24a93996ae153 100644 (file)
@@ -335,13 +335,14 @@ void Magick::drawImage::operator()( Magick::Image &image_ ) const
 }
 
 // Edge image (hilight edges in image)
-Magick::edgeImage::edgeImage( const double radius_ )
-  : _radius( radius_ )
+Magick::edgeImage::edgeImage( const double radius_, const double sigma_ )
+  : _radius( radius_ ),
+    _sigma( sigma_ )
 {
 }
 void Magick::edgeImage::operator()( Magick::Image &image_ ) const
 {
-  image_.edge( _radius );
+  image_.edge( _radius, _sigma );
 }
 
 // Emboss image (hilight edges with 3D effect)
index 536b0646b7e9589ba8378a05b1d95bc13c33cea0..3a3365aed24297ee7a20b9feb621158a1982c40b 100644 (file)
@@ -8316,7 +8316,8 @@ static Image *XMagickCommand(Display *display,XResourceInfo *resource_info,
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
       flags=ParseGeometry(radius,&geometry_info);
-      edge_image=EdgeImage(*image,geometry_info.rho,exception);
+      edge_image=EdgeImage(*image,geometry_info.rho,geometry_info.sigma,
+        exception);
       if (edge_image != (Image *) NULL)
         {
           *image=DestroyImage(*image);
@@ -8351,7 +8352,8 @@ static Image *XMagickCommand(Display *display,XResourceInfo *resource_info,
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
       flags=ParseGeometry(amount,&geometry_info);
-      spread_image=EdgeImage(*image,geometry_info.rho,exception);
+      spread_image=EdgeImage(*image,geometry_info.rho,geometry_info.sigma,
+        exception);
       if (spread_image != (Image *) NULL)
         {
           *image=DestroyImage(*image);
index 6e35d1511bb9fc973bf3a5e02aab86991e73f54a..fa49098bcecffc8d31f863b17596ecd070f075ab 100644 (file)
@@ -226,7 +226,7 @@ MagickExport Image *AdaptiveBlurImage(const Image *image,
   /*
     Edge detect the image brighness channel, level, blur, and level again.
   */
-  edge_image=EdgeImage(image,radius,exception);
+  edge_image=EdgeImage(image,radius,sigma,exception);
   if (edge_image == (Image *) NULL)
     {
       blur_image=DestroyImage(blur_image);
@@ -401,7 +401,7 @@ MagickExport Image *AdaptiveBlurImage(const Image *image,
           proceed;
 
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp critical (MagickCore_AdaptiveSharpenImage)
+  #pragma omp critical (MagickCore_AdaptiveBlurImage)
 #endif
         proceed=SetImageProgress(image,AdaptiveBlurImageTag,progress++,
           image->rows);
@@ -517,7 +517,7 @@ MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius,
   /*
     Edge detect the image brighness channel, level, sharp, and level again.
   */
-  edge_image=EdgeImage(image,radius,exception);
+  edge_image=EdgeImage(image,radius,sigma,exception);
   if (edge_image == (Image *) NULL)
     {
       sharp_image=DestroyImage(sharp_image);
@@ -1741,7 +1741,7 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception)
 %  The format of the EdgeImage method is:
 %
 %      Image *EdgeImage(const Image *image,const double radius,
-%        ExceptionInfo *exception)
+%        const double sigma,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
@@ -1749,11 +1749,13 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception)
 %
 %    o radius: the radius of the pixel neighborhood.
 %
+%    o sigma: the standard deviation of the Gaussian, in pixels.
+%
 %    o exception: return any errors or warnings in this structure.
 %
 */
 MagickExport Image *EdgeImage(const Image *image,const double radius,
-  ExceptionInfo *exception)
+  const double sigma,ExceptionInfo *exception)
 {
   Image
     *edge_image;
@@ -1778,7 +1780,7 @@ MagickExport Image *EdgeImage(const Image *image,const double radius,
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
-  width=GetOptimalKernelWidth1D(radius,0.5);
+  width=GetOptimalKernelWidth2D(radius,sigma);
   kernel_info=AcquireKernelInfo((const char *) NULL);
   if (kernel_info == (KernelInfo *) NULL)
     ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
@@ -2605,7 +2607,7 @@ MagickExport Image *PreviewImage(const Image *image,const PreviewType preview,
       }
       case EdgeDetectPreview:
       {
-        preview_image=EdgeImage(thumbnail,radius,exception);
+        preview_image=EdgeImage(thumbnail,radius,sigma,exception);
         (void) FormatLocaleString(label,MaxTextExtent,"edge %g",radius);
         break;
       }
index 40cfd0d366a01e4923f534810345833e9e93f6ef..6d83189b874ef65cb737737abb315ec8df18ff64 100644 (file)
@@ -78,7 +78,7 @@ extern MagickExport Image
   *BlurImage(const Image *,const double,const double,ExceptionInfo *),
   *ConvolveImage(const Image *,const KernelInfo *,ExceptionInfo *),
   *DespeckleImage(const Image *,ExceptionInfo *),
-  *EdgeImage(const Image *,const double,ExceptionInfo *),
+  *EdgeImage(const Image *,const double,const double,ExceptionInfo *),
   *EmbossImage(const Image *,const double,const double,ExceptionInfo *),
   *GaussianBlurImage(const Image *,const double,const double,ExceptionInfo *),
   *MotionBlurImage(const Image *,const double,const double,const double,
index 640bbf403f7d56448aa0a0351117942b9ce2d7f7..34f65a31dec70408a0b6ed3031ff6055c8dcc364 100644 (file)
@@ -641,7 +641,7 @@ MagickExport Image *CharcoalImage(const Image *image,const double radius,
   if (clone_image == (Image *) NULL)
     return((Image *) NULL);
   (void) SetImageType(clone_image,GrayscaleType,exception);
-  edge_image=EdgeImage(clone_image,radius,exception);
+  edge_image=EdgeImage(clone_image,radius,sigma,exception);
   clone_image=DestroyImage(clone_image);
   if (edge_image == (Image *) NULL)
     return((Image *) NULL);
@@ -4366,7 +4366,7 @@ MagickExport Image *SketchImage(const Image *image,const double radius,
   random_image=DestroyImage(random_image);
   if (blur_image == (Image *) NULL)
     return((Image *) NULL);
-  dodge_image=EdgeImage(blur_image,radius,exception);
+  dodge_image=EdgeImage(blur_image,radius,sigma,exception);
   blur_image=DestroyImage(blur_image);
   if (dodge_image == (Image *) NULL)
     return((Image *) NULL);
index 20abc98abefda96f78428ac0b6658da19c6e6329..9d66efd8649a909ac9d6ad5fde21246f259e398b 100644 (file)
@@ -2502,7 +2502,8 @@ WandExport MagickBooleanType MagickDrawImage(MagickWand *wand,
 %
 %  The format of the MagickEdgeImage method is:
 %
-%      MagickBooleanType MagickEdgeImage(MagickWand *wand,const double radius)
+%      MagickBooleanType MagickEdgeImage(MagickWand *wand,const double radius,
+%        const double sigma)
 %
 %  A description of each parameter follows:
 %
@@ -2510,9 +2511,11 @@ WandExport MagickBooleanType MagickDrawImage(MagickWand *wand,
 %
 %    o radius: the radius of the pixel neighborhood.
 %
+%    o sigma: the standard deviation of the Gaussian, in pixels.
+%
 */
 WandExport MagickBooleanType MagickEdgeImage(MagickWand *wand,
-  const double radius)
+  const double radius,const double sigma)
 {
   Image
     *edge_image;
@@ -2523,7 +2526,7 @@ WandExport MagickBooleanType MagickEdgeImage(MagickWand *wand,
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  edge_image=EdgeImage(wand->images,radius,wand->exception);
+  edge_image=EdgeImage(wand->images,radius,sigma,wand->exception);
   if (edge_image == (Image *) NULL)
     return(MagickFalse);
   ReplaceImageInList(&wand->images,edge_image);
index 8e2cb98e52c1ffcb780679a5f327e34b8d5a2b34..1f3e19888f19fdd42ef9f3644d529179d5f74372 100644 (file)
@@ -118,7 +118,7 @@ extern WandExport MagickBooleanType
   MagickDistortImage(MagickWand *,const DistortImageMethod,const size_t,
     const double *,const MagickBooleanType),
   MagickDrawImage(MagickWand *,const DrawingWand *),
-  MagickEdgeImage(MagickWand *,const double),
+  MagickEdgeImage(MagickWand *,const double,const double),
   MagickEmbossImage(MagickWand *,const double,const double),
   MagickEncipherImage(MagickWand *,const char *),
   MagickEnhanceImage(MagickWand *),
index e6a1ddea9447866c642c29ca29aea22df96fa73e..97ec4a789b631712ca93de607c0814a2469c3d8f 100644 (file)
@@ -1409,7 +1409,8 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
             flags=ParseGeometry(argv[i+1],&geometry_info);
             if ((flags & SigmaValue) == 0)
               geometry_info.sigma=1.0;
-            mogrify_image=EdgeImage(*image,geometry_info.rho,exception);
+            mogrify_image=EdgeImage(*image,geometry_info.rho,
+              geometry_info.sigma,exception);
             break;
           }
         if (LocaleCompare("emboss",option+1) == 0)
index c5b907e94a80745fa13071ff0bb49b60f09681fe..e4ebb7560f2bbc0ae1de2734800462f4d6d518af 100644 (file)
@@ -7606,7 +7606,8 @@ Mogrify(ref,...)
         {
           if (attribute_flag[0] != 0)
             geometry_info.rho=argument_list[0].real_reference;
-          image=EdgeImage(image,geometry_info.rho,exception);
+          image=EdgeImage(image,geometry_info.rho,geometry_info.sigma,
+            exception);
           break;
         }
         case 11:  /* Emboss */
index 042d8ede3fb048b5a34c0b52f7f9207d5469c882..06d6be97ecf00837421d1983d0babf35383dc61a 100644 (file)
@@ -2762,7 +2762,7 @@ static void MSLStartElement(void *context,const xmlChar *tag,
               }
             }
           edge_image=EdgeImage(msl_info->image[n],geometry_info.rho,
-            &msl_info->image[n]->exception);
+            geometry_info.sigma,&msl_info->image[n]->exception);
           if (edge_image == (Image *) NULL)
             break;
           msl_info->image[n]=DestroyImage(msl_info->image[n]);