]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Sat, 14 Apr 2012 01:34:21 +0000 (01:34 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Sat, 14 Apr 2012 01:34:21 +0000 (01:34 +0000)
MagickCore/effect.c
MagickCore/fx.c
MagickCore/random.c
MagickCore/random_.h
MagickCore/statistic.c
MagickCore/thread-private.h
MagickCore/threshold.c

index ba9c80183d64e73992160381d77940236e2a9b68..d4ca0194162318690b61c9cf67be98cebdf7cb8b 100644 (file)
@@ -3512,6 +3512,7 @@ MagickExport Image *SpreadImage(const Image *image,const double radius,
     *spread_image;
 
   MagickBooleanType
+    concurrent,
     status;
 
   MagickOffsetType
@@ -3551,10 +3552,12 @@ MagickExport Image *SpreadImage(const Image *image,const double radius,
   progress=0;
   width=GetOptimalKernelWidth1D(radius,0.5);
   random_info=AcquireRandomInfoThreadSet();
+  concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue :
+    MagickFalse;
   image_view=AcquireCacheView(image);
   spread_view=AcquireCacheView(spread_image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,8) shared(progress,status)
+  #pragma omp parallel for schedule(static,8) shared(progress,status) omp_concurrent(concurrent)
 #endif
   for (y=0; y < (ssize_t) image->rows; y++)
   {
index 46875b6be541a6f5612a40874af208ff7edf5f2f..b34ce09cc0eea43c6e0b74ea62024a74d1937954 100644 (file)
@@ -265,6 +265,7 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
     *noise_image;
 
   MagickBooleanType
+    concurrent,
     status;
 
   MagickOffsetType
@@ -299,10 +300,12 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
   status=MagickTrue;
   progress=0;
   random_info=AcquireRandomInfoThreadSet();
+  concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue :
+    MagickFalse;
   image_view=AcquireCacheView(image);
   noise_view=AcquireCacheView(noise_image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,4) shared(progress,status)
+  #pragma omp parallel for schedule(static,4) shared(progress,status) omp_concurrent(concurrent)
 #endif
   for (y=0; y < (ssize_t) image->rows; y++)
   {
@@ -4379,6 +4382,7 @@ MagickExport Image *SketchImage(const Image *image,const double radius,
     *sketch_image;
 
   MagickBooleanType
+    concurrent,
     status;
 
   RandomInfo
@@ -4396,9 +4400,11 @@ MagickExport Image *SketchImage(const Image *image,const double radius,
     return((Image *) NULL);
   status=MagickTrue;
   random_info=AcquireRandomInfoThreadSet();
+  concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue :
+    MagickFalse;
   random_view=AcquireCacheView(random_image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,4) shared(status)
+  #pragma omp parallel for schedule(static,4) shared(status) omp_concurrent(concurrent)
 #endif
   for (y=0; y < (ssize_t) random_image->rows; y++)
   {
index 407b0357019281cee017286201199d38a26bfe3f..0118e741baebb06f0e5aa19cc94f95c6b60a62ea 100644 (file)
@@ -92,6 +92,9 @@ struct _RandomInfo
   double
     normalize;
 
+  unsigned long
+    secret_key;
+
   unsigned short
     protocol_major,
     protocol_minor;
@@ -186,9 +189,10 @@ MagickExport RandomInfo *AcquireRandomInfo(void)
     random_info->signature_info));
   ResetStringInfo(random_info->reservoir);
   random_info->normalize=1.0/(~0UL);
-  random_info->semaphore=AllocateSemaphoreInfo();
+  random_info->secret_key=random_seed;
   random_info->protocol_major=RandomProtocolMajorVersion;
   random_info->protocol_minor=RandomProtocolMinorVersion;
+  random_info->semaphore=AllocateSemaphoreInfo();
   random_info->timestamp=(ssize_t) time(0);
   random_info->signature=MagickSignature;
   /*
@@ -219,9 +223,9 @@ MagickExport RandomInfo *AcquireRandomInfo(void)
   /*
     Seed pseudo random number generator.
   */
-  if (random_seed == ~0UL)
+  if (random_info->secret_key == ~0UL)
     {
-      key=GetRandomKey(random_info,sizeof(random_seed));
+      key=GetRandomKey(random_info,sizeof(random_info->secret_key));
       (void) CopyMagickMemory(random_info->seed,GetStringInfoDatum(key),
         GetStringInfoLength(key));
       key=DestroyStringInfo(key);
@@ -232,12 +236,8 @@ MagickExport RandomInfo *AcquireRandomInfo(void)
         *signature_info;
 
       signature_info=AcquireSignatureInfo();
-      key=AcquireStringInfo(sizeof(random_seed));
-      SetStringInfoDatum(key,(unsigned char *) &random_seed);
-      if ((random_seed << 1) > random_seed)
-        random_seed<<=1;
-      else
-        random_seed>>=1;
+      key=AcquireStringInfo(sizeof(random_info->secret_key));
+      SetStringInfoDatum(key,(unsigned char *) &random_info->secret_key);
       UpdateSignature(signature_info,key);
       key=DestroyStringInfo(key);
       FinalizeSignature(signature_info);
@@ -662,6 +662,32 @@ MagickExport StringInfo *GetRandomKey(RandomInfo *random_info,
 %                                                                             %
 %                                                                             %
 %                                                                             %
+%   G e t R a n d o m S e c r e t K e y                                       %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  GetRandomSecretKey() returns the random secet key.
+%
+%  The format of the GetRandomSecretKey method is:
+%
+%      unsigned long GetRandomSecretKey(const RandomInfo *random_info)
+%
+%  A description of each parameter follows:
+%
+%    o random_info: the random info.
+*/
+MagickExport unsigned long GetRandomSecretKey(const RandomInfo *random_info)
+{
+  return(random_info->secret_key);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
 %   G e t R a n d o m V a l u e                                               %
 %                                                                             %
 %                                                                             %
index ab1eeb57f59f0159aafa8a03045f65ea543c3317..f8213c0cd6ddb20ebb4a997be29e28572fb3ee6e 100644 (file)
@@ -44,6 +44,9 @@ extern MagickExport RandomInfo
 extern MagickExport StringInfo
   *GetRandomKey(RandomInfo *,const size_t);
 
+extern MagickExport unsigned long
+  GetRandomSecretKey(const RandomInfo *);
+
 extern MagickExport void
   SeedPseudoRandomGenerator(const unsigned long),
   SetRandomKey(RandomInfo *,const size_t,unsigned char *),
index e335bed4f22dead749e7fb0dcea1b3824b8dbd81..4eead7a7f814bd5e17bc99562f91fa30401e1bff 100644 (file)
@@ -436,6 +436,7 @@ MagickExport Image *EvaluateImages(const Image *images,
     *evaluate_image;
 
   MagickBooleanType
+    concurrent,
     status;
 
   MagickOffsetType
@@ -496,11 +497,13 @@ MagickExport Image *EvaluateImages(const Image *images,
   status=MagickTrue;
   progress=0;
   random_info=AcquireRandomInfoThreadSet();
+  concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue :
+    MagickFalse;
   evaluate_view=AcquireCacheView(evaluate_image);
   if (op == MedianEvaluateOperator)
     {
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-      #pragma omp parallel for schedule(static) shared(progress,status)
+      #pragma omp parallel for schedule(static) shared(progress,status) omp_concurrent(concurrent)
 #endif
       for (y=0; y < (ssize_t) evaluate_image->rows; y++)
       {
@@ -607,7 +610,7 @@ MagickExport Image *EvaluateImages(const Image *images,
   else
     {
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-      #pragma omp parallel for schedule(static) shared(progress,status)
+      #pragma omp parallel for schedule(static) shared(progress,status) omp_concurrent(concurrent)
 #endif
       for (y=0; y < (ssize_t) evaluate_image->rows; y++)
       {
@@ -784,6 +787,7 @@ MagickExport MagickBooleanType EvaluateImage(Image *image,
     *image_view;
 
   MagickBooleanType
+    concurrent,
     status;
 
   MagickOffsetType
@@ -805,10 +809,14 @@ MagickExport MagickBooleanType EvaluateImage(Image *image,
     return(MagickFalse);
   status=MagickTrue;
   progress=0;
+  concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue :
+    MagickFalse;
   random_info=AcquireRandomInfoThreadSet();
+  concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue :
+    MagickFalse;
   image_view=AcquireCacheView(image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,4) shared(progress,status)
+  #pragma omp parallel for schedule(static,4) shared(progress,status) omp_concurrent(concurrent)
 #endif
   for (y=0; y < (ssize_t) image->rows; y++)
   {
index 6f34e489f9e1cfd3df391eb6c97832f83df90d33..add3a0e2db72eb392265fd4243ffdcf764c7025b 100644 (file)
@@ -31,6 +31,8 @@ extern "C" {
 #define MagickCachePrefetch(address,mode,locality)
 #endif
 
+#define omp_concurrent(concurrent) \
+  num_threads((concurrent) != MagickFalse ? omp_get_max_threads() : 1)
 #define omp_throttle(factor)  num_threads(omp_get_max_threads() >> \
    (factor) == 0 ? 1 : omp_get_max_threads() >> (factor))
 
index 7728a9e198a07387f68ee3f7a61fb5145698c93f..997199f132d7f1ac407de9c1fd3d7c6358bb2768 100644 (file)
@@ -1435,6 +1435,7 @@ MagickExport MagickBooleanType RandomThresholdImage(Image *image,
     flags;
 
   MagickBooleanType
+    concurrent,
     status;
 
   MagickOffsetType
@@ -1461,6 +1462,8 @@ MagickExport MagickBooleanType RandomThresholdImage(Image *image,
   assert(exception->signature == MagickSignature);
   if (thresholds == (const char *) NULL)
     return(MagickTrue);
+  if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
+    return(MagickFalse);
   GetPixelInfo(image,&threshold);
   min_threshold=0.0;
   max_threshold=(MagickRealType) QuantumRange;
@@ -1479,12 +1482,12 @@ MagickExport MagickBooleanType RandomThresholdImage(Image *image,
   */
   status=MagickTrue;
   progress=0;
-  if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
-    return(MagickFalse);
   random_info=AcquireRandomInfoThreadSet();
+  concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue :
+    MagickFalse;
   image_view=AcquireCacheView(image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,8) shared(progress,status)
+  #pragma omp parallel for schedule(static,8) shared(progress,status) omp_concurrent(concurrent)
 #endif
   for (y=0; y < (ssize_t) image->rows; y++)
   {