]> granicus.if.org Git - imagemagick/blobdiff - magick/fx.c
(no commit message)
[imagemagick] / magick / fx.c
index d5f887db3620f0c935672926cdc8fb9de12dc4ee..c88c313d7df0f301c561db2a7fe4ac8fd6b12d6d 100644 (file)
@@ -17,7 +17,7 @@
 %                                 October 1996                                %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -144,6 +144,7 @@ struct _FxInfo
 %  The format of the AcquireFxInfo method is:
 %
 %      FxInfo *AcquireFxInfo(Image *image,const char *expression)
+%
 %  A description of each parameter follows:
 %
 %    o image: the image.
@@ -162,7 +163,7 @@ MagickExport FxInfo *AcquireFxInfo(const Image *image,const char *expression)
   register ssize_t
     i;
 
-  fx_info=(FxInfo *) AcquireAlignedMemory(1,sizeof(*fx_info));
+  fx_info=(FxInfo *) AcquireMagickMemory(sizeof(*fx_info));
   if (fx_info == (FxInfo *) NULL)
     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
   (void) ResetMagickMemory(fx_info,0,sizeof(*fx_info));
@@ -214,6 +215,10 @@ MagickExport FxInfo *AcquireFxInfo(const Image *image,const char *expression)
       (void) SubstituteString(&fx_info->expression,"8e-","8**10^-");
       (void) SubstituteString(&fx_info->expression,"9e-","9**10^-");
     }
+  /*
+    Force right-to-left associativity for unary negation.
+  */
+  (void) SubstituteString(&fx_info->expression,"-","-1.0*");
   /*
     Convert complex to simple operators.
   */
@@ -346,8 +351,8 @@ MagickExport Image *AddNoiseImageChannel(const Image *image,
 #endif
   for (y=0; y < (ssize_t) image->rows; y++)
   {
-    int
-      id;
+    const int
+      id = GetOpenMPThreadId();
 
     MagickBooleanType
       sync;
@@ -379,7 +384,6 @@ MagickExport Image *AddNoiseImageChannel(const Image *image,
       }
     indexes=GetCacheViewVirtualIndexQueue(image_view);
     noise_indexes=GetCacheViewAuthenticIndexQueue(noise_view);
-    id=GetOpenMPThreadId();
     for (x=0; x < (ssize_t) image->columns; x++)
     {
       if ((channel & RedChannel) != 0)
@@ -2853,7 +2857,7 @@ static FxInfo **DestroyFxThreadSet(FxInfo **fx_info)
   for (i=0; i < (ssize_t) GetOpenMPMaximumThreads(); i++)
     if (fx_info[i] != (FxInfo *) NULL)
       fx_info[i]=DestroyFxInfo(fx_info[i]);
-  fx_info=(FxInfo **) RelinquishAlignedMemory(fx_info);
+  fx_info=(FxInfo **) RelinquishMagickMemory(fx_info);
   return(fx_info);
 }
 
@@ -2876,7 +2880,7 @@ static FxInfo **AcquireFxThreadSet(const Image *image,const char *expression,
     number_threads;
 
   number_threads=GetOpenMPMaximumThreads();
-  fx_info=(FxInfo **) AcquireAlignedMemory(number_threads,sizeof(*fx_info));
+  fx_info=(FxInfo **) AcquireQuantumMemory(number_threads,sizeof(*fx_info));
   if (fx_info == (FxInfo **) NULL)
     return((FxInfo **) NULL);
   (void) ResetMagickMemory(fx_info,0,number_threads*sizeof(*fx_info));
@@ -2968,8 +2972,8 @@ MagickExport Image *FxImageChannel(const Image *image,const ChannelType channel,
 #endif
   for (y=0; y < (ssize_t) fx_image->rows; y++)
   {
-    int
-      id;
+    const int
+      id = GetOpenMPThreadId();
 
     MagickRealType
       alpha;
@@ -2992,7 +2996,6 @@ MagickExport Image *FxImageChannel(const Image *image,const ChannelType channel,
         continue;
       }
     fx_indexes=GetCacheViewAuthenticIndexQueue(fx_view);
-    id=GetOpenMPThreadId();
     alpha=0.0;
     for (x=0; x < (ssize_t) fx_image->columns; x++)
     {
@@ -3176,8 +3179,8 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount,
 #endif
   for (y=0; y < (ssize_t) image->rows; y++)
   {
-    int
-      id;
+    const int
+      id = GetOpenMPThreadId();
 
     MagickPixelPacket
       pixel;
@@ -3209,7 +3212,6 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount,
     implode_indexes=GetCacheViewAuthenticIndexQueue(implode_view);
     delta.y=scale.y*(double) (y-center.y);
     pixel=zero;
-    id=GetOpenMPThreadId();
     for (x=0; x < (ssize_t) image->columns; x++)
     {
       /*
@@ -3526,8 +3528,8 @@ static inline Quantum PlasmaPixel(RandomInfo *random_info,
 }
 
 MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
-  RandomInfo *random_info,const SegmentInfo *segment,size_t attenuate,
-  size_t depth)
+  CacheView *image_view,RandomInfo *random_info,const SegmentInfo *segment,
+  size_t attenuate,size_t depth)
 {
   ExceptionInfo
     *exception;
@@ -3562,22 +3564,24 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
       local_info=(*segment);
       local_info.x2=(double) x_mid;
       local_info.y2=(double) y_mid;
-      (void) PlasmaImageProxy(image,random_info,&local_info,attenuate,depth);
+      (void) PlasmaImageProxy(image,image_view,random_info,&local_info,
+        attenuate,depth);
       local_info=(*segment);
       local_info.y1=(double) y_mid;
       local_info.x2=(double) x_mid;
-      (void) PlasmaImageProxy(image,random_info,&local_info,attenuate,depth);
+      (void) PlasmaImageProxy(image,image_view,random_info,&local_info,
+        attenuate,depth);
       local_info=(*segment);
       local_info.x1=(double) x_mid;
       local_info.y2=(double) y_mid;
-      (void) PlasmaImageProxy(image,random_info,&local_info,attenuate,depth);
+      (void) PlasmaImageProxy(image,image_view,random_info,&local_info,
+        attenuate,depth);
       local_info=(*segment);
       local_info.x1=(double) x_mid;
       local_info.y1=(double) y_mid;
-      return(PlasmaImageProxy(image,random_info,&local_info,attenuate,depth));
+      return(PlasmaImageProxy(image,image_view,random_info,&local_info,
+        attenuate,depth));
     }
-  if (SetImageStorageClass(image,DirectClass) == MagickFalse)
-    return(MagickFalse);
   x_mid=(ssize_t) ceil((segment->x1+segment->x2)/2-0.5);
   y_mid=(ssize_t) ceil((segment->y1+segment->y2)/2-0.5);
   if ((segment->x1 == (double) x_mid) && (segment->x2 == (double) x_mid) &&
@@ -3597,11 +3601,11 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
         Left pixel.
       */
       x=(ssize_t) ceil(segment->x1-0.5);
-      (void) GetOneVirtualPixel(image,x,(ssize_t) ceil(segment->y1-0.5),&u,
-        exception);
-      (void) GetOneVirtualPixel(image,x,(ssize_t) ceil(segment->y2-0.5),&v,
-        exception);
-      q=QueueAuthenticPixels(image,x,y_mid,1,1,exception);
+      (void) GetOneCacheViewVirtualPixel(image_view,x,(ssize_t)
+        ceil(segment->y1-0.5),&u,exception);
+      (void) GetOneCacheViewVirtualPixel(image_view,x,(ssize_t)
+        ceil(segment->y2-0.5),&v,exception);
+      q=QueueCacheViewAuthenticPixels(image_view,x,y_mid,1,1,exception);
       if (q == (PixelPacket *) NULL)
         return(MagickTrue);
       q->red=PlasmaPixel(random_info,(MagickRealType) (u.red+v.red)/2.0,
@@ -3610,18 +3614,18 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
         plasma);
       q->blue=PlasmaPixel(random_info,(MagickRealType) (u.blue+v.blue)/2.0,
         plasma);
-      (void) SyncAuthenticPixels(image,exception);
+      (void) SyncCacheViewAuthenticPixels(image_view,exception);
       if (segment->x1 != segment->x2)
         {
           /*
             Right pixel.
           */
           x=(ssize_t) ceil(segment->x2-0.5);
-          (void) GetOneVirtualPixel(image,x,(ssize_t) ceil(segment->y1-0.5),&u,
-            exception);
-          (void) GetOneVirtualPixel(image,x,(ssize_t) ceil(segment->y2-0.5),&v,
-            exception);
-          q=QueueAuthenticPixels(image,x,y_mid,1,1,exception);
+          (void) GetOneCacheViewVirtualPixel(image_view,x,(ssize_t)
+            ceil(segment->y1-0.5),&u,exception);
+          (void) GetOneCacheViewVirtualPixel(image_view,x,(ssize_t)
+            ceil(segment->y2-0.5),&v,exception);
+          q=QueueCacheViewAuthenticPixels(image_view,x,y_mid,1,1,exception);
           if (q == (PixelPacket *) NULL)
             return(MagickTrue);
           q->red=PlasmaPixel(random_info,(MagickRealType) (u.red+v.red)/2.0,
@@ -3629,8 +3633,8 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
           q->green=PlasmaPixel(random_info,(MagickRealType) (u.green+v.green)/
             2.0,plasma);
           q->blue=PlasmaPixel(random_info,(MagickRealType) (u.blue+v.blue)/2.0,
-             plasma);
-          (void) SyncAuthenticPixels(image,exception);
+            plasma);
+          (void) SyncCacheViewAuthenticPixels(image_view,exception);
         }
     }
   if ((segment->y1 != (double) y_mid) || (segment->y2 != (double) y_mid))
@@ -3644,11 +3648,11 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
             Bottom pixel.
           */
           y=(ssize_t) ceil(segment->y2-0.5);
-          (void) GetOneVirtualPixel(image,(ssize_t) ceil(segment->x1-0.5),y,&u,
-            exception);
-          (void) GetOneVirtualPixel(image,(ssize_t) ceil(segment->x2-0.5),y,&v,
-            exception);
-          q=QueueAuthenticPixels(image,x_mid,y,1,1,exception);
+          (void) GetOneCacheViewVirtualPixel(image_view,(ssize_t)
+            ceil(segment->x1-0.5),y,&u,exception);
+          (void) GetOneCacheViewVirtualPixel(image_view,(ssize_t)
+            ceil(segment->x2-0.5),y,&v,exception);
+          q=QueueCacheViewAuthenticPixels(image_view,x_mid,y,1,1,exception);
           if (q == (PixelPacket *) NULL)
             return(MagickTrue);
           q->red=PlasmaPixel(random_info,(MagickRealType) (u.red+v.red)/2.0,
@@ -3657,7 +3661,7 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
             2.0,plasma);
           q->blue=PlasmaPixel(random_info,(MagickRealType) (u.blue+v.blue)/2.0,
             plasma);
-          (void) SyncAuthenticPixels(image,exception);
+          (void) SyncCacheViewAuthenticPixels(image_view,exception);
         }
       if (segment->y1 != segment->y2)
         {
@@ -3668,11 +3672,11 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
             Top pixel.
           */
           y=(ssize_t) ceil(segment->y1-0.5);
-          (void) GetOneVirtualPixel(image,(ssize_t) ceil(segment->x1-0.5),y,&u,
-            exception);
-          (void) GetOneVirtualPixel(image,(ssize_t) ceil(segment->x2-0.5),y,&v,
-            exception);
-          q=QueueAuthenticPixels(image,x_mid,y,1,1,exception);
+          (void) GetOneCacheViewVirtualPixel(image_view,(ssize_t)
+            ceil(segment->x1-0.5),y,&u,exception);
+          (void) GetOneCacheViewVirtualPixel(image_view,(ssize_t)
+            ceil(segment->x2-0.5),y,&v,exception);
+          q=QueueCacheViewAuthenticPixels(image_view,x_mid,y,1,1,exception);
           if (q == (PixelPacket *) NULL)
             return(MagickTrue);
           q->red=PlasmaPixel(random_info,(MagickRealType) (u.red+v.red)/2.0,
@@ -3681,7 +3685,7 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
             2.0,plasma);
           q->blue=PlasmaPixel(random_info,(MagickRealType) (u.blue+v.blue)/2.0,
             plasma);
-          (void) SyncAuthenticPixels(image,exception);
+          (void) SyncCacheViewAuthenticPixels(image_view,exception);
         }
     }
   if ((segment->x1 != segment->x2) || (segment->y1 != segment->y2))
@@ -3697,8 +3701,8 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
       (void) GetOneVirtualPixel(image,x,y,&u,exception);
       x=(ssize_t) ceil(segment->x2-0.5);
       y=(ssize_t) ceil(segment->y2-0.5);
-      (void) GetOneVirtualPixel(image,x,y,&v,exception);
-      q=QueueAuthenticPixels(image,x_mid,y_mid,1,1,exception);
+      (void) GetOneCacheViewVirtualPixel(image_view,x,y,&v,exception);
+      q=QueueCacheViewAuthenticPixels(image_view,x_mid,y_mid,1,1,exception);
       if (q == (PixelPacket *) NULL)
         return(MagickTrue);
       q->red=PlasmaPixel(random_info,(MagickRealType) (u.red+v.red)/2.0,
@@ -3707,7 +3711,7 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
         plasma);
       q->blue=PlasmaPixel(random_info,(MagickRealType) (u.blue+v.blue)/2.0,
         plasma);
-      (void) SyncAuthenticPixels(image,exception);
+      (void) SyncCacheViewAuthenticPixels(image_view,exception);
     }
   if (((segment->x2-segment->x1) < 3.0) && ((segment->y2-segment->y1) < 3.0))
     return(MagickTrue);
@@ -3717,6 +3721,9 @@ MagickExport MagickBooleanType PlasmaImageProxy(Image *image,
 MagickExport MagickBooleanType PlasmaImage(Image *image,
   const SegmentInfo *segment,size_t attenuate,size_t depth)
 {
+  CacheView
+    *image_view;
+
   MagickBooleanType
     status;
 
@@ -3729,9 +3736,13 @@ MagickExport MagickBooleanType PlasmaImage(Image *image,
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
+  if (SetImageStorageClass(image,DirectClass) == MagickFalse)
+    return(MagickFalse);
+  image_view=AcquireCacheView(image);
   random_info=AcquireRandomInfo();
-  status=PlasmaImageProxy(image,random_info,segment,attenuate,depth);
+  status=PlasmaImageProxy(image,image_view,random_info,segment,attenuate,depth);
   random_info=DestroyRandomInfo(random_info);
+  image_view=DestroyCacheView(image_view);
   return(status);
 }
 \f
@@ -3827,7 +3838,8 @@ MagickExport Image *PolaroidImage(const Image *image,const DrawInfo *draw_info,
       caption=InterpretImageProperties((ImageInfo *) NULL,(Image *) image,
         value);
       (void) CloneString(&annotate_info->text,caption);
-      count=FormatMagickCaption(caption_image,annotate_info,&metrics,&caption);
+      count=FormatMagickCaption(caption_image,annotate_info,MagickTrue,&metrics,
+        &caption);
       status=SetImageExtent(caption_image,image->columns,(size_t)
         ((count+1)*(metrics.ascent-metrics.descent)+0.5));
       if (status == MagickFalse)
@@ -4294,8 +4306,8 @@ MagickExport Image *SketchImage(const Image *image,const double radius,
 #endif
   for (y=0; y < (ssize_t) random_image->rows; y++)
   {
-    int
-      id;
+    const int
+      id = GetOpenMPThreadId();
 
     MagickPixelPacket
       pixel;
@@ -4320,7 +4332,6 @@ MagickExport Image *SketchImage(const Image *image,const double radius,
       }
     indexes=GetCacheViewAuthenticIndexQueue(random_view);
     pixel=zero;
-    id=GetOpenMPThreadId();
     for (x=0; x < (ssize_t) random_image->columns; x++)
     {
       pixel.red=(MagickRealType) (QuantumRange*
@@ -4532,40 +4543,43 @@ MagickExport MagickBooleanType SolarizeImage(Image *image,
 MagickExport Image *SteganoImage(const Image *image,const Image *watermark,
   ExceptionInfo *exception)
 {
-#define GetBit(alpha,i) ((((size_t) (alpha) >> (size_t) \
-  (i)) & 0x01) != 0)
+#define GetBit(alpha,i) ((((size_t) (alpha) >> (size_t) (i)) & 0x01) != 0)
 #define SetBit(alpha,i,set) (alpha)=(Quantum) ((set) != 0 ? (size_t) (alpha) \
   | (one << (size_t) (i)) : (size_t) (alpha) & ~(one << (size_t) (i)))
 #define SteganoImageTag  "Stegano/Image"
 
+  CacheView
+    *stegano_view,
+    *watermark_view;
+
   Image
     *stegano_image;
 
   int
     c;
 
-  ssize_t
-    i,
-    j,
-    k,
-    y;
-
   MagickBooleanType
     status;
 
   PixelPacket
     pixel;
 
-  register ssize_t
-    x;
-
   register PixelPacket
     *q;
 
+  register ssize_t
+    x;
+
   size_t
     depth,
     one;
 
+  ssize_t
+    i,
+    j,
+    k,
+    y;
+
   /*
     Initialize steganographic image attributes.
   */
@@ -4596,17 +4610,20 @@ MagickExport Image *SteganoImage(const Image *image,const Image *watermark,
   j=0;
   depth=stegano_image->depth;
   k=image->offset;
+  watermark_view=AcquireCacheView(watermark);
+  stegano_view=AcquireCacheView(stegano_image);
   for (i=(ssize_t) depth-1; (i >= 0) && (j < (ssize_t) depth); i--)
   {
     for (y=0; (y < (ssize_t) watermark->rows) && (j < (ssize_t) depth); y++)
     {
       for (x=0; (x < (ssize_t) watermark->columns) && (j < (ssize_t) depth); x++)
       {
-        (void) GetOneVirtualPixel(watermark,x,y,&pixel,exception);
+        (void) GetOneCacheViewVirtualPixel(watermark_view,x,y,&pixel,exception);
         if ((k/(ssize_t) stegano_image->columns) >= (ssize_t) stegano_image->rows)
           break;
-        q=GetAuthenticPixels(stegano_image,k % (ssize_t) stegano_image->columns,
-          k/(ssize_t) stegano_image->columns,1,1,exception);
+        q=GetCacheViewAuthenticPixels(stegano_view,k % (ssize_t)
+          stegano_image->columns,k/(ssize_t) stegano_image->columns,1,1,
+          exception);
         if (q == (PixelPacket *) NULL)
           break;
         switch (c)
@@ -4627,7 +4644,7 @@ MagickExport Image *SteganoImage(const Image *image,const Image *watermark,
             break;
           }
         }
-        if (SyncAuthenticPixels(stegano_image,exception) == MagickFalse)
+        if (SyncCacheViewAuthenticPixels(stegano_view,exception) == MagickFalse)
           break;
         c++;
         if (c == 3)
@@ -4650,6 +4667,8 @@ MagickExport Image *SteganoImage(const Image *image,const Image *watermark,
           status=MagickFalse;
       }
   }
+  stegano_view=DestroyCacheView(stegano_view);
+  watermark_view=DestroyCacheView(watermark_view);
   if (stegano_image->storage_class == PseudoClass)
     (void) SyncImage(stegano_image);
   return(stegano_image);
@@ -4905,8 +4924,8 @@ MagickExport Image *SwirlImage(const Image *image,double degrees,
 #endif
   for (y=0; y < (ssize_t) image->rows; y++)
   {
-    int
-      id;
+    const int
+      id = GetOpenMPThreadId();
 
     MagickPixelPacket
       pixel;
@@ -4938,7 +4957,6 @@ MagickExport Image *SwirlImage(const Image *image,double degrees,
     swirl_indexes=GetCacheViewAuthenticIndexQueue(swirl_view);
     delta.y=scale.y*(double) (y-center.y);
     pixel=zero;
-    id=GetOpenMPThreadId();
     for (x=0; x < (ssize_t) image->columns; x++)
     {
       /*
@@ -5376,8 +5394,8 @@ MagickExport Image *WaveImage(const Image *image,const double amplitude,
 #endif
   for (y=0; y < (ssize_t) wave_image->rows; y++)
   {
-    int
-      id;
+    const int
+      id = GetOpenMPThreadId();
 
     MagickPixelPacket
       pixel;
@@ -5402,7 +5420,6 @@ MagickExport Image *WaveImage(const Image *image,const double amplitude,
       }
     indexes=GetCacheViewAuthenticIndexQueue(wave_view);
     pixel=zero;
-    id=GetOpenMPThreadId();
     for (x=0; x < (ssize_t) wave_image->columns; x++)
     {
       (void) ResamplePixelColor(resample_filter[id],(double) x,(double) (y-