]> granicus.if.org Git - imagemagick/blobdiff - magick/paint.c
(no commit message)
[imagemagick] / magick / paint.c
index eeab38c770490bcdd10be5592d31bc61fc52e740..6de39fbdd71df523610a1cb4674f0fbb19f4a503 100644 (file)
 #include "magick/string_.h"
 #include "magick/thread-private.h"
 \f
-static inline double MagickMax(const double x,const double y)
-{
-    return( x > y ? x : y);
-}
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %                                                                             %
@@ -88,7 +84,7 @@ static inline double MagickMax(const double x,const double y)
 %
 %      MagickBooleanType FloodfillPaintImage(Image *image,
 %        const ChannelType channel,const DrawInfo *draw_info,
-%        const MagickPixelPacket target,const long x_offset,const long y_offset,
+%        const MagickPixelPacket target,const ssize_t x_offset,const ssize_t y_offset,
 %        const MagickBooleanType invert)
 %
 %  A description of each parameter follows:
@@ -108,7 +104,7 @@ static inline double MagickMax(const double x,const double y)
 */
 MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
   const ChannelType channel,const DrawInfo *draw_info,
-  const MagickPixelPacket *target,const long x_offset,const long y_offset,
+  const MagickPixelPacket *target,const ssize_t x_offset,const ssize_t y_offset,
   const MagickBooleanType invert)
 {
 #define MaxStacksize  (1UL << 15)
@@ -118,7 +114,7 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
     ThrowBinaryException(DrawError,"SegmentStackOverflow",image->filename) \
   else \
     { \
-      if ((((up)+(delta)) >= 0) && (((up)+(delta)) < (long) image->rows)) \
+      if ((((up)+(delta)) >= 0) && (((up)+(delta)) < (ssize_t) image->rows)) \
         { \
           s->x1=(double) (left); \
           s->y1=(double) (up); \
@@ -135,7 +131,7 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
   Image
     *floodplane_image;
 
-  long
+  ssize_t
     offset,
     start,
     x,
@@ -168,9 +164,9 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(draw_info != (DrawInfo *) NULL);
   assert(draw_info->signature == MagickSignature);
-  if ((x_offset < 0) || (x_offset >= (long) image->columns))
+  if ((x_offset < 0) || (x_offset >= (ssize_t) image->columns))
     return(MagickFalse);
-  if ((y_offset < 0) || (y_offset >= (long) image->rows))
+  if ((y_offset < 0) || (y_offset >= (ssize_t) image->rows))
     return(MagickFalse);
   if (SetImageStorageClass(image,DirectClass) == MagickFalse)
     return(MagickFalse);
@@ -211,7 +207,7 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
     register const PixelPacket
       *restrict p;
 
-    register long
+    register ssize_t
       x;
 
     register PixelPacket
@@ -221,15 +217,15 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
       Pop segment off stack.
     */
     s--;
-    x1=(long) s->x1;
-    x2=(long) s->x2;
-    offset=(long) s->y2;
-    y=(long) s->y1+offset;
+    x1=(ssize_t) s->x1;
+    x2=(ssize_t) s->x2;
+    offset=(ssize_t) s->y2;
+    y=(ssize_t) s->y1+offset;
     /*
       Recolor neighboring pixels.
     */
-    p=GetVirtualPixels(image,0,y,(unsigned long) (x1+1),1,exception);
-    q=GetAuthenticPixels(floodplane_image,0,y,(unsigned long) (x1+1),1,
+    p=GetVirtualPixels(image,0,y,(size_t) (x1+1),1,exception);
+    q=GetAuthenticPixels(floodplane_image,0,y,(size_t) (x1+1),1,
       exception);
     if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
       break;
@@ -261,7 +257,7 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
     {
       if (skip == MagickFalse)
         {
-          if (x < (long) image->columns)
+          if (x < (ssize_t) image->columns)
             {
               p=GetVirtualPixels(image,x,y,image->columns-x,1,exception);
               q=GetAuthenticPixels(floodplane_image,x,y,image->columns-x,1,
@@ -270,7 +266,7 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
                   (q == (PixelPacket *) NULL))
                 break;
               indexes=GetVirtualIndexQueue(image);
-              for ( ; x < (long) image->columns; x++)
+              for ( ; x < (ssize_t) image->columns; x++)
               {
                 if (q->opacity == (Quantum) TransparentOpacity)
                   break;
@@ -292,8 +288,8 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
       x++;
       if (x <= x2)
         {
-          p=GetVirtualPixels(image,x,y,(unsigned long) (x2-x+1),1,exception);
-          q=GetAuthenticPixels(floodplane_image,x,y,(unsigned long) (x2-x+1),1,
+          p=GetVirtualPixels(image,x,y,(size_t) (x2-x+1),1,exception);
+          q=GetAuthenticPixels(floodplane_image,x,y,(size_t) (x2-x+1),1,
             exception);
           if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
             break;
@@ -312,7 +308,7 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
       start=x;
     } while (x <= x2);
   }
-  for (y=0; y < (long) image->rows; y++)
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
     register const PixelPacket
       *restrict p;
@@ -320,7 +316,7 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
     register IndexPacket
       *restrict indexes;
 
-    register long
+    register ssize_t
       x;
 
     register PixelPacket
@@ -334,7 +330,7 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
     if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
       break;
     indexes=GetAuthenticIndexQueue(image);
-    for (x=0; x < (long) image->columns; x++)
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
       if (p->opacity != OpaqueOpacity)
         {
@@ -343,16 +339,16 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
           if (image->colorspace == CMYKColorspace)
             ConvertRGBToCMYK(&fill);
           if ((channel & RedChannel) != 0)
-            q->red=RoundToQuantum(fill.red);
+            q->red=ClampToQuantum(fill.red);
           if ((channel & GreenChannel) != 0)
-            q->green=RoundToQuantum(fill.green);
+            q->green=ClampToQuantum(fill.green);
           if ((channel & BlueChannel) != 0)
-            q->blue=RoundToQuantum(fill.blue);
+            q->blue=ClampToQuantum(fill.blue);
           if ((channel & OpacityChannel) != 0)
-            q->opacity=RoundToQuantum(fill.opacity);
+            q->opacity=ClampToQuantum(fill.opacity);
           if (((channel & IndexChannel) != 0) &&
               (image->colorspace == CMYKColorspace))
-            indexes[x]=RoundToQuantum(fill.index);
+            indexes[x]=ClampToQuantum(fill.index);
         }
       p++;
       q++;
@@ -362,7 +358,7 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
   }
   segment_stack=(SegmentInfo *) RelinquishMagickMemory(segment_stack);
   floodplane_image=DestroyImage(floodplane_image);
-  return(y == (long) image->rows ? MagickTrue : MagickFalse);
+  return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse);
 }
 \f
 /*
@@ -403,6 +399,12 @@ MagickExport MagickBooleanType FloodfillPaintImage(Image *image,
 % This provides a good example of making use of the DrawGradientImage
 % function and the gradient structure in draw_info.
 */
+
+static inline double MagickMax(const double x,const double y)
+{
+  return(x > y ? x : y);
+}
+
 MagickExport MagickBooleanType GradientImage(Image *image,
   const GradientType type,const SpreadMethod method,
   const PixelPacket *start_color,const PixelPacket *stop_color)
@@ -416,7 +418,7 @@ MagickExport MagickBooleanType GradientImage(Image *image,
   MagickBooleanType
     status;
 
-  register long
+  register ssize_t
     i;
 
   /*
@@ -452,7 +454,7 @@ MagickExport MagickBooleanType GradientImage(Image *image,
       image->filename);
   (void) ResetMagickMemory(gradient->stops,0,gradient->number_stops*
     sizeof(*gradient->stops));
-  for (i=0; i < (long) gradient->number_stops; i++)
+  for (i=0; i < (ssize_t) gradient->number_stops; i++)
     GetMagickPixelPacket(image,&gradient->stops[i].color);
   SetMagickPixelPacket(image,start_color,(IndexPacket *) NULL,
     &gradient->stops[0].color);
@@ -504,39 +506,39 @@ MagickExport MagickBooleanType GradientImage(Image *image,
 %
 */
 
-static unsigned long **DestroyHistogramThreadSet(unsigned long **histogram)
+static size_t **DestroyHistogramThreadSet(size_t **histogram)
 {
-  register long
+  register ssize_t
     i;
 
-  assert(histogram != (unsigned long **) NULL);
-  for (i=0; i < (long) GetOpenMPMaximumThreads(); i++)
-    if (histogram[i] != (unsigned long *) NULL)
-      histogram[i]=(unsigned long *) RelinquishMagickMemory(histogram[i]);
-  histogram=(unsigned long **) RelinquishAlignedMemory(histogram);
+  assert(histogram != (size_t **) NULL);
+  for (i=0; i < (ssize_t) GetOpenMPMaximumThreads(); i++)
+    if (histogram[i] != (size_t *) NULL)
+      histogram[i]=(size_t *) RelinquishMagickMemory(histogram[i]);
+  histogram=(size_t **) RelinquishAlignedMemory(histogram);
   return(histogram);
 }
 
-static unsigned long **AcquireHistogramThreadSet(const size_t count)
+static size_t **AcquireHistogramThreadSet(const size_t count)
 {
-  register long
+  register ssize_t
     i;
 
-  unsigned long
+  size_t
     **histogram,
     number_threads;
 
   number_threads=GetOpenMPMaximumThreads();
-  histogram=(unsigned long **) AcquireAlignedMemory(number_threads,
+  histogram=(size_t **) AcquireAlignedMemory(number_threads,
     sizeof(*histogram));
-  if (histogram == (unsigned long **) NULL)
-    return((unsigned long **) NULL);
+  if (histogram == (size_t **) NULL)
+    return((size_t **) NULL);
   (void) ResetMagickMemory(histogram,0,number_threads*sizeof(*histogram));
-  for (i=0; i < (long) number_threads; i++)
+  for (i=0; i < (ssize_t) number_threads; i++)
   {
-    histogram[i]=(unsigned long *) AcquireQuantumMemory(count,
+    histogram[i]=(size_t *) AcquireQuantumMemory(count,
       sizeof(**histogram));
-    if (histogram[i] == (unsigned long *) NULL)
+    if (histogram[i] == (size_t *) NULL)
       return(DestroyHistogramThreadSet(histogram));
   }
   return(histogram);
@@ -555,17 +557,19 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
   Image
     *paint_image;
 
-  long
-    progress,
-    y;
-
   MagickBooleanType
     status;
 
-  unsigned long
+  MagickOffsetType
+    progress;
+
+  size_t
     **restrict histograms,
     width;
 
+  ssize_t
+    y;
+
   /*
     Initialize painted image attributes.
   */
@@ -588,7 +592,7 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
       return((Image *) NULL);
     }
   histograms=AcquireHistogramThreadSet(NumberPaintBins);
-  if (histograms == (unsigned long **) NULL)
+  if (histograms == (size_t **) NULL)
     {
       paint_image=DestroyImage(paint_image);
       ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
@@ -603,7 +607,7 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(dynamic,4) shared(progress,status)
 #endif
-  for (y=0; y < (long) image->rows; y++)
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
     register const IndexPacket
       *restrict indexes;
@@ -614,18 +618,18 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
     register IndexPacket
       *restrict paint_indexes;
 
-    register long
+    register ssize_t
       x;
 
     register PixelPacket
       *restrict q;
 
-    register unsigned long
+    register size_t
       *histogram;
 
     if (status == MagickFalse)
       continue;
-    p=GetCacheViewVirtualPixels(image_view,-((long) width/2L),y-(long) (width/
+    p=GetCacheViewVirtualPixels(image_view,-((ssize_t) width/2L),y-(ssize_t) (width/
       2L),image->columns+width,width,exception);
     q=QueueCacheViewAuthenticPixels(paint_view,0,y,paint_image->columns,1,
       exception);
@@ -637,18 +641,18 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
     indexes=GetCacheViewVirtualIndexQueue(image_view);
     paint_indexes=GetCacheViewAuthenticIndexQueue(paint_view);
     histogram=histograms[GetOpenMPThreadId()];
-    for (x=0; x < (long) image->columns; x++)
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
-      long
+      ssize_t
         j,
         k,
         v;
 
-      register long
+      register ssize_t
         i,
         u;
 
-      unsigned long
+      size_t
         count;
 
       /*
@@ -658,11 +662,11 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
       j=0;
       count=0;
       (void) ResetMagickMemory(histogram,0,NumberPaintBins*sizeof(*histogram));
-      for (v=0; v < (long) width; v++)
+      for (v=0; v < (ssize_t) width; v++)
       {
-        for (u=0; u < (long) width; u++)
+        for (u=0; u < (ssize_t) width; u++)
         {
-          k=(long) ScaleQuantumToChar(PixelIntensityToQuantum(p+u+i));
+          k=(ssize_t) ScaleQuantumToChar(PixelIntensityToQuantum(p+u+i));
           histogram[k]++;
           if (histogram[k] > count)
             {
@@ -670,7 +674,7 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius,
               count=histogram[k];
             }
         }
-        i+=image->columns+width;
+        i+=(ssize_t) (image->columns+width);
       }
       *q=(*(p+j));
       if (image->colorspace == CMYKColorspace)
@@ -763,16 +767,18 @@ MagickExport MagickBooleanType OpaquePaintImageChannel(Image *image,
   ExceptionInfo
     *exception;
 
-  long
-    progress,
-    y;
-
   MagickBooleanType
     status;
 
+  MagickOffsetType
+    progress;
+
   MagickPixelPacket
     zero;
 
+  ssize_t
+    y;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   assert(target != (MagickPixelPacket *) NULL);
@@ -792,7 +798,7 @@ MagickExport MagickBooleanType OpaquePaintImageChannel(Image *image,
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(dynamic,4) shared(progress,status)
 #endif
-  for (y=0; y < (long) image->rows; y++)
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
     MagickPixelPacket
       pixel;
@@ -800,7 +806,7 @@ MagickExport MagickBooleanType OpaquePaintImageChannel(Image *image,
     register IndexPacket
       *restrict indexes;
 
-    register long
+    register ssize_t
       x;
 
     register PixelPacket
@@ -816,22 +822,22 @@ MagickExport MagickBooleanType OpaquePaintImageChannel(Image *image,
       }
     indexes=GetCacheViewAuthenticIndexQueue(image_view);
     pixel=zero;
-    for (x=0; x < (long) image->columns; x++)
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
       SetMagickPixelPacket(image,q,indexes+x,&pixel);
       if (IsMagickColorSimilar(&pixel,target) != invert)
         {
           if ((channel & RedChannel) != 0)
-            q->red=RoundToQuantum(fill->red);
+            q->red=ClampToQuantum(fill->red);
           if ((channel & GreenChannel) != 0)
-            q->green=RoundToQuantum(fill->green);
+            q->green=ClampToQuantum(fill->green);
           if ((channel & BlueChannel) != 0)
-            q->blue=RoundToQuantum(fill->blue);
+            q->blue=ClampToQuantum(fill->blue);
           if ((channel & OpacityChannel) != 0)
-            q->opacity=RoundToQuantum(fill->opacity);
+            q->opacity=ClampToQuantum(fill->opacity);
           if (((channel & IndexChannel) != 0) &&
               (image->colorspace == CMYKColorspace))
-            indexes[x]=RoundToQuantum(fill->index);
+            indexes[x]=ClampToQuantum(fill->index);
         }
       q++;
     }
@@ -904,16 +910,18 @@ MagickExport MagickBooleanType TransparentPaintImage(Image *image,
   ExceptionInfo
     *exception;
 
-  long
-    progress,
-    y;
-
   MagickBooleanType
     status;
 
+  MagickOffsetType
+    progress;
+
   MagickPixelPacket
     zero;
 
+  ssize_t
+    y;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   assert(target != (MagickPixelPacket *) NULL);
@@ -934,7 +942,7 @@ MagickExport MagickBooleanType TransparentPaintImage(Image *image,
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(dynamic,4) shared(progress,status)
 #endif
-  for (y=0; y < (long) image->rows; y++)
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
     MagickPixelPacket
       pixel;
@@ -942,7 +950,7 @@ MagickExport MagickBooleanType TransparentPaintImage(Image *image,
     register IndexPacket
       *restrict indexes;
 
-    register long
+    register ssize_t
       x;
 
     register PixelPacket
@@ -958,7 +966,7 @@ MagickExport MagickBooleanType TransparentPaintImage(Image *image,
       }
     indexes=GetCacheViewAuthenticIndexQueue(image_view);
     pixel=zero;
-    for (x=0; x < (long) image->columns; x++)
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
       SetMagickPixelPacket(image,q,indexes+x,&pixel);
       if (IsMagickColorSimilar(&pixel,target) != invert)
@@ -1037,13 +1045,15 @@ MagickExport MagickBooleanType TransparentPaintImageChroma(Image *image,
   ExceptionInfo
     *exception;
 
-  long
-    progress,
-    y;
-
   MagickBooleanType
     status;
 
+  MagickOffsetType
+    progress;
+
+  ssize_t
+    y;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   assert(high != (MagickPixelPacket *) NULL);
@@ -1064,7 +1074,7 @@ MagickExport MagickBooleanType TransparentPaintImageChroma(Image *image,
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(dynamic,4) shared(progress,status)
 #endif
-  for (y=0; y < (long) image->rows; y++)
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
     MagickBooleanType
       match;
@@ -1075,7 +1085,7 @@ MagickExport MagickBooleanType TransparentPaintImageChroma(Image *image,
     register IndexPacket
       *restrict indexes;
 
-    register long
+    register ssize_t
       x;
 
     register PixelPacket
@@ -1091,7 +1101,7 @@ MagickExport MagickBooleanType TransparentPaintImageChroma(Image *image,
       }
     indexes=GetCacheViewAuthenticIndexQueue(image_view);
     GetMagickPixelPacket(image,&pixel);
-    for (x=0; x < (long) image->columns; x++)
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
       SetMagickPixelPacket(image,q,indexes+x,&pixel);
       match=((pixel.red >= low->red) && (pixel.red <= high->red) &&