]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/paint.c
https://github.com/ImageMagick/ImageMagick/issues/1336
[imagemagick] / MagickCore / paint.c
index b2dafb3b306b86c4110a3b5a7aaa10ca8bbe7503..609e53d59daa662f458f0a80526eb45ffd1139af 100644 (file)
 %                                 July 1998                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2017 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2018 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  %
 %  obtain a copy of the License at                                            %
 %                                                                             %
-%    https://www.imagemagick.org/script/license.php                           %
+%    https://imagemagick.org/script/license.php                               %
 %                                                                             %
 %  Unless required by applicable law or agreed to in writing, software        %
 %  distributed under the License is distributed on an "AS IS" BASIS,          %
@@ -186,7 +186,7 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
   /*
     Set floodfill state.
   */
-  floodplane_image=CloneImage(image,image->columns,image->rows,MagickTrue,
+  floodplane_image=CloneImage(image,0,0,MagickTrue,
     exception);
   if (floodplane_image == (Image *) NULL)
     return(MagickFalse);
@@ -547,43 +547,46 @@ MagickExport MagickBooleanType GradientImage(Image *image,
       */
       sine=sin((double) DegreesToRadians(gradient->angle-90.0));
       cosine=cos((double) DegreesToRadians(gradient->angle-90.0));
-      distance=fabs((double) image->columns*cosine)+
-        fabs((double) image->rows*sine);
-      gradient->gradient_vector.x1=0.5*(image->columns-distance*cosine);
-      gradient->gradient_vector.y1=0.5*(image->rows-distance*sine);
-      gradient->gradient_vector.x2=0.5*(image->columns+distance*cosine);
-      gradient->gradient_vector.y2=0.5*(image->rows+distance*sine);
+      distance=fabs((double) (image->columns-1.0)*cosine)+
+        fabs((double) (image->rows-1.0)*sine);
+      gradient->gradient_vector.x1=0.5*((image->columns-1.0)-distance*cosine);
+      gradient->gradient_vector.y1=0.5*((image->rows-1.0)-distance*sine);
+      gradient->gradient_vector.x2=0.5*((image->columns-1.0)+distance*cosine);
+      gradient->gradient_vector.y2=0.5*((image->rows-1.0)+distance*sine);
     }
-  gradient->radii.x=(double) MagickMax(image->columns,image->rows)/2.0;
+  gradient->radii.x=(double) MagickMax((image->columns-1.0),(image->rows-1.0))/
+    2.0;
   gradient->radii.y=gradient->radii.x;
   artifact=GetImageArtifact(image,"gradient:extent");
   if (artifact != (const char *) NULL)
     {
       if (LocaleCompare(artifact,"Circle") == 0)
         {
-          gradient->radii.x=(double) MagickMax(image->columns,image->rows)/2.0;
+          gradient->radii.x=(double) MagickMax((image->columns-1.0),
+            (image->rows-1.0))/2.0;
           gradient->radii.y=gradient->radii.x;
         }
       if (LocaleCompare(artifact,"Diagonal") == 0)
         {
-          gradient->radii.x=(double) (sqrt(image->columns*image->columns+
-            image->rows*image->rows))/2.0;
+          gradient->radii.x=(double) (sqrt((double) (image->columns-1.0)*
+            (image->columns-1.0)+(image->rows-1.0)*(image->rows-1.0)))/2.0;
           gradient->radii.y=gradient->radii.x;
         }
       if (LocaleCompare(artifact,"Ellipse") == 0)
         {
-          gradient->radii.x=(double) image->columns/2.0;
-          gradient->radii.y=(double) image->rows/2.0;
+          gradient->radii.x=(double) (image->columns-1.0)/2.0;
+          gradient->radii.y=(double) (image->rows-1.0)/2.0;
         }
       if (LocaleCompare(artifact,"Maximum") == 0)
         {
-          gradient->radii.x=(double) MagickMax(image->columns,image->rows)/2.0;
+          gradient->radii.x=(double) MagickMax((image->columns-1.0),
+            (image->rows-1.0))/2.0;
           gradient->radii.y=gradient->radii.x;
         }
       if (LocaleCompare(artifact,"Minimum") == 0)
         {
-          gradient->radii.x=(double) (MagickMin(image->columns,image->rows))/
-            2.0;
+          gradient->radii.x=(double) (MagickMin((image->columns-1.0),
+            (image->rows-1.0)))/2.0;
           gradient->radii.y=gradient->radii.x;
         }
     }
@@ -602,7 +605,7 @@ MagickExport MagickBooleanType GradientImage(Image *image,
   if (gradient->stops == (StopInfo *) NULL)
     ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
       image->filename);
-  (void) CopyMagickMemory(gradient->stops,stops,(size_t) number_stops*
+  (void) memcpy(gradient->stops,stops,(size_t) number_stops*
     sizeof(*stops));
   /*
     Draw a gradient on the image.
@@ -670,7 +673,7 @@ static size_t **AcquireHistogramThreadSet(const size_t count)
   histogram=(size_t **) AcquireQuantumMemory(number_threads,sizeof(*histogram));
   if (histogram == (size_t **) NULL)
     return((size_t **) NULL);
-  (void) ResetMagickMemory(histogram,0,number_threads*sizeof(*histogram));
+  (void) memset(histogram,0,number_threads*sizeof(*histogram));
   for (i=0; i < (ssize_t) number_threads; i++)
   {
     histogram[i]=(size_t *) AcquireQuantumMemory(count,sizeof(**histogram));
@@ -719,7 +722,7 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
   assert(exception->signature == MagickCoreSignature);
   width=GetOptimalKernelWidth2D(radius,sigma);
   linear_image=CloneImage(image,0,0,MagickTrue,exception);
-  paint_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception);
+  paint_image=CloneImage(image,0,0,MagickTrue,exception);
   if ((linear_image == (Image *) NULL) || (paint_image == (Image *) NULL))
     {
       if (linear_image != (Image *) NULL)
@@ -751,8 +754,8 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
   image_view=AcquireVirtualCacheView(linear_image,exception);
   paint_view=AcquireAuthenticCacheView(paint_image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,4) shared(progress,status) \
-    magick_threads(linear_image,paint_image,linear_image->rows,1)
+  #pragma omp parallel for schedule(static) shared(progress,status) \
+    magick_number_threads(linear_image,paint_image,linear_image->rows,1)
 #endif
   for (y=0; y < (ssize_t) linear_image->rows; y++)
   {
@@ -801,7 +804,7 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
       k=0;
       j=0;
       count=0;
-      (void) ResetMagickMemory(histogram,0,NumberPaintBins* sizeof(*histogram));
+      (void) memset(histogram,0,NumberPaintBins* sizeof(*histogram));
       for (v=0; v < (ssize_t) width; v++)
       {
         for (u=0; u < (ssize_t) width; u++)
@@ -819,14 +822,13 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
       }
       for (i=0; i < (ssize_t) GetPixelChannels(linear_image); i++)
       {
-        PixelChannel channel=GetPixelChannelChannel(linear_image,i);
-        PixelTrait traits=GetPixelChannelTraits(linear_image,channel);
+        PixelChannel channel = GetPixelChannelChannel(linear_image,i);
+        PixelTrait traits = GetPixelChannelTraits(linear_image,channel);
         PixelTrait paint_traits=GetPixelChannelTraits(paint_image,channel);
         if ((traits == UndefinedPixelTrait) ||
             (paint_traits == UndefinedPixelTrait))
           continue;
-        if (((paint_traits & CopyPixelTrait) != 0) ||
-            (GetPixelWriteMask(linear_image,p) == 0))
+        if ((paint_traits & CopyPixelTrait) != 0)
           {
             SetPixelChannel(paint_image,channel,p[center+i],q);
             continue;
@@ -942,8 +944,8 @@ MagickExport MagickBooleanType OpaquePaintImage(Image *image,
   GetPixelInfo(image,&zero);
   image_view=AcquireAuthenticCacheView(image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,4) shared(progress,status) \
-    magick_threads(image,image,image->rows,1)
+  #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++)
   {
@@ -967,24 +969,27 @@ MagickExport MagickBooleanType OpaquePaintImage(Image *image,
     pixel=zero;
     for (x=0; x < (ssize_t) image->columns; x++)
     {
-      if (GetPixelWriteMask(image,q) == 0)
-        {
-          q+=GetPixelChannels(image);
-          continue;
-        }
       GetPixelInfoPixel(image,q,&pixel);
       if (IsFuzzyEquivalencePixelInfo(&pixel,&conform_target) != invert)
         {
-          if (image->channel_map[RedPixelChannel].traits == UpdatePixelTrait)
-            SetPixelRed(image,conform_fill.red,q);
-          if (image->channel_map[GreenPixelChannel].traits == UpdatePixelTrait)
-            SetPixelGreen(image,conform_fill.green,q);
-          if (image->channel_map[BluePixelChannel].traits == UpdatePixelTrait)
-            SetPixelBlue(image,conform_fill.blue,q);
-          if (image->channel_map[BlackPixelChannel].traits == UpdatePixelTrait)
-            SetPixelBlack(image,conform_fill.black,q);
-          if (image->channel_map[AlphaPixelChannel].traits == UpdatePixelTrait)
-            SetPixelAlpha(image,conform_fill.alpha,q);
+          PixelTrait
+            traits;
+
+          traits=GetPixelChannelTraits(image,RedPixelChannel);
+          if ((traits & UpdatePixelTrait) != 0)
+            SetPixelRed(image,(Quantum) conform_fill.red,q);
+          traits=GetPixelChannelTraits(image,GreenPixelChannel);
+          if ((traits & UpdatePixelTrait) != 0)
+            SetPixelGreen(image,(Quantum) conform_fill.green,q);
+          traits=GetPixelChannelTraits(image,BluePixelChannel);
+          if ((traits & UpdatePixelTrait) != 0)
+            SetPixelBlue(image,(Quantum) conform_fill.blue,q);
+          traits=GetPixelChannelTraits(image,BlackPixelChannel);
+          if ((traits & UpdatePixelTrait) != 0)
+            SetPixelBlack(image,(Quantum) conform_fill.black,q);
+          traits=GetPixelChannelTraits(image,AlphaPixelChannel);
+          if ((traits & UpdatePixelTrait) != 0)
+            SetPixelAlpha(image,(Quantum) conform_fill.alpha,q);
         }
       q+=GetPixelChannels(image);
     }
@@ -1085,8 +1090,8 @@ MagickExport MagickBooleanType TransparentPaintImage(Image *image,
   GetPixelInfo(image,&zero);
   image_view=AcquireAuthenticCacheView(image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,4) shared(progress,status) \
-    magick_threads(image,image,image->rows,1)
+  #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++)
   {
@@ -1110,11 +1115,6 @@ MagickExport MagickBooleanType TransparentPaintImage(Image *image,
     pixel=zero;
     for (x=0; x < (ssize_t) image->columns; x++)
     {
-      if (GetPixelWriteMask(image,q) == 0)
-        {
-          q+=GetPixelChannels(image);
-          continue;
-        }
       GetPixelInfoPixel(image,q,&pixel);
       if (IsFuzzyEquivalencePixelInfo(&pixel,target) != invert)
         SetPixelAlpha(image,opacity,q);
@@ -1217,8 +1217,8 @@ MagickExport MagickBooleanType TransparentPaintImageChroma(Image *image,
   progress=0;
   image_view=AcquireAuthenticCacheView(image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-  #pragma omp parallel for schedule(static,4) shared(progress,status) \
-    magick_threads(image,image,image->rows,1)
+  #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++)
   {
@@ -1245,11 +1245,6 @@ MagickExport MagickBooleanType TransparentPaintImageChroma(Image *image,
     GetPixelInfo(image,&pixel);
     for (x=0; x < (ssize_t) image->columns; x++)
     {
-      if (GetPixelWriteMask(image,q) == 0)
-        {
-          q+=GetPixelChannels(image);
-          continue;
-        }
       GetPixelInfoPixel(image,q,&pixel);
       match=((pixel.red >= low->red) && (pixel.red <= high->red) &&
         (pixel.green >= low->green) && (pixel.green <= high->green) &&