check for under/overflow
diff --git a/MagickCore/annotate.c b/MagickCore/annotate.c
index 088d414..37bd037 100644
--- a/MagickCore/annotate.c
+++ b/MagickCore/annotate.c
@@ -1722,8 +1722,8 @@
 
           if (status == MagickFalse)
             continue;
-          x_offset=(ssize_t) ceil(point.x-0.5);
-          y_offset=(ssize_t) ceil(point.y+y-0.5);
+          x_offset=MagickDoubleToLong(ceil(point.x-0.5));
+          y_offset=MagickDoubleToLong(ceil(point.y+y-0.5));
           if ((y_offset < 0) || (y_offset >= (ssize_t) image->rows))
             continue;
           q=(Quantum *) NULL;
@@ -1738,7 +1738,7 @@
           n=y*bitmap->bitmap.pitch;
           for (x=0; x < (ssize_t) bitmap->bitmap.width; x++, n++)
           {
-            x_offset=(ssize_t) ceil(point.x+x-0.5);
+            x_offset=MagickDoubleToLong(ceil(point.x+x-0.5));
             if ((x_offset < 0) || (x_offset >= (ssize_t) image->columns))
               {
                 if (q != (Quantum *) NULL)
@@ -2090,8 +2090,8 @@
       crop_info=GetImageBoundingBox(annotate_image,exception);
       crop_info.height=(size_t) ((resolution.y/DefaultResolution)*
         ExpandAffine(&draw_info->affine)*draw_info->pointsize+0.5);
-      crop_info.y=(ssize_t) ceil((resolution.y/DefaultResolution)*extent.y/8.0-
-        0.5);
+      crop_info.y=MagickDoubleToLong(ceil((resolution.y/DefaultResolution)*
+        extent.y/8.0-0.5));
       (void) FormatLocaleString(geometry,MagickPathExtent,
         "%.20gx%.20g%+.20g%+.20g",(double) crop_info.width,(double)
         crop_info.height,(double) crop_info.x,(double) crop_info.y);
diff --git a/MagickCore/constitute.c b/MagickCore/constitute.c
index a9e9ee4..13a089f 100644
--- a/MagickCore/constitute.c
+++ b/MagickCore/constitute.c
@@ -834,12 +834,14 @@
           if ((flags & LessValue) != 0)
             {
               if (next->delay < (size_t) floor(geometry_info.rho+0.5))
-                next->ticks_per_second=(ssize_t) floor(geometry_info.sigma+0.5);
+                next->ticks_per_second=MagickDoubleToLong(floor(
+                  geometry_info.sigma+0.5));
             }
           else
             next->delay=(size_t) floor(geometry_info.rho+0.5);
         if ((flags & SigmaValue) != 0)
-          next->ticks_per_second=(ssize_t) floor(geometry_info.sigma+0.5);
+          next->ticks_per_second=MagickDoubleToLong(floor(
+            geometry_info.sigma+0.5));
       }
     option=GetImageOption(image_info,"dispose");
     if (option != (const char *) NULL)
diff --git a/MagickCore/draw.c b/MagickCore/draw.c
index 4e85a40..79eb35e 100644
--- a/MagickCore/draw.c
+++ b/MagickCore/draw.c
@@ -1233,8 +1233,8 @@
   edge.y2=MagickMin(max.y,(double) image->rows-1.0);
   inverse_affine=InverseAffineMatrix(affine);
   GetPixelInfo(image,&zero);
-  start=(ssize_t) ceil(edge.y1-0.5);
-  stop=(ssize_t) floor(edge.y2+0.5);
+  start=MagickDoubleToLong(ceil(edge.y1-0.5));
+  stop=MagickDoubleToLong(floor(edge.y2+0.5));
   source_view=AcquireVirtualCacheView(source,exception);
   image_view=AcquireAuthenticCacheView(image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
@@ -1267,15 +1267,16 @@
     inverse_edge=AffineEdge(source,&inverse_affine,(double) y,&edge);
     if (inverse_edge.x2 < inverse_edge.x1)
       continue;
-    q=GetCacheViewAuthenticPixels(image_view,(ssize_t) ceil(inverse_edge.x1-
-      0.5),y,(size_t) (floor(inverse_edge.x2+0.5)-ceil(inverse_edge.x1-0.5)+1),
-      1,exception);
+    q=GetCacheViewAuthenticPixels(image_view,MagickDoubleToLong(
+      ceil(inverse_edge.x1-0.5)),y,(size_t) MagickDoubleToLong(floor(
+      inverse_edge.x2+0.5)-ceil(inverse_edge.x1-0.5)+1),1,exception);
     if (q == (Quantum *) NULL)
       continue;
     pixel=zero;
     composite=zero;
     x_offset=0;
-    for (x=(ssize_t) ceil(inverse_edge.x1-0.5); x <= (ssize_t) floor(inverse_edge.x2+0.5); x++)
+    for (x=MagickDoubleToLong(ceil(inverse_edge.x1-0.5));
+         x <= MagickDoubleToLong(floor(inverse_edge.x2+0.5)); x++)
     {
       point.x=(double) x*inverse_affine.sx+y*inverse_affine.ry+
         inverse_affine.tx;
@@ -2089,8 +2090,8 @@
         case UndefinedSpread:
         case PadSpread:
         {
-          if ((x != (ssize_t) ceil(gradient_vector->x1-0.5)) ||
-              (y != (ssize_t) ceil(gradient_vector->y1-0.5)))
+          if ((x != MagickDoubleToLong(ceil(gradient_vector->x1-0.5))) ||
+              (y != MagickDoubleToLong(ceil(gradient_vector->y1-0.5))))
             {
               offset=GetStopColorOffset(gradient,x,y);
               if (gradient->type != RadialGradient)
@@ -2117,8 +2118,8 @@
         }
         case ReflectSpread:
         {
-          if ((x != (ssize_t) ceil(gradient_vector->x1-0.5)) ||
-              (y != (ssize_t) ceil(gradient_vector->y1-0.5)))
+          if ((x != MagickDoubleToLong(ceil(gradient_vector->x1-0.5))) ||
+              (y != MagickDoubleToLong(ceil(gradient_vector->y1-0.5))))
             {
               offset=GetStopColorOffset(gradient,x,y);
               if (gradient->type != RadialGradient)
@@ -2159,8 +2160,8 @@
 
           antialias=MagickFalse;
           repeat=0.0;
-          if ((x != (ssize_t) ceil(gradient_vector->x1-0.5)) ||
-              (y != (ssize_t) ceil(gradient_vector->y1-0.5)))
+          if ((x != MagickDoubleToLong(ceil(gradient_vector->x1-0.5))) ||
+              (y != MagickDoubleToLong(ceil(gradient_vector->y1-0.5))))
             {
               offset=GetStopColorOffset(gradient,x,y);
               if (gradient->type == LinearGradient)
@@ -3455,20 +3456,22 @@
                 (void) GetNextToken(q,&q,extent,token);
                 (void) CopyMagickString(name,token,MagickPathExtent);
                 (void) GetNextToken(q,&q,extent,token);
-                bounds.x=(ssize_t) ceil(GetDrawValue(token,&next_token)-0.5);
+                bounds.x=MagickDoubleToLong(ceil(GetDrawValue(token,
+                  &next_token)-0.5));
                 if (token == next_token)
                   ThrowPointExpectedException(token,exception);
                 (void) GetNextToken(q,&q,extent,token);
                 if (*token == ',')
                   (void) GetNextToken(q,&q,extent,token);
-                bounds.y=(ssize_t) ceil(GetDrawValue(token,&next_token)-0.5);
+                bounds.y=MagickDoubleToLong(ceil(GetDrawValue(token,
+                  &next_token)-0.5));
                 if (token == next_token)
                   ThrowPointExpectedException(token,exception);
                 (void) GetNextToken(q,&q,extent,token);
                 if (*token == ',')
                   (void) GetNextToken(q,&q,extent,token);
-                bounds.width=(size_t) floor(GetDrawValue(token,&next_token)+
-                  0.5);
+                bounds.width=(size_t) MagickDoubleToLong(floor(GetDrawValue(
+                  token,&next_token)+0.5));
                 if (token == next_token)
                   ThrowPointExpectedException(token,exception);
                 (void) GetNextToken(q,&q,extent,token);
@@ -3878,29 +3881,29 @@
         if (LocaleCompare("viewbox",keyword) == 0)
           {
             (void) GetNextToken(q,&q,extent,token);
-            graphic_context[n]->viewbox.x=(ssize_t) ceil(GetDrawValue(token,
-              &next_token)-0.5);
+            graphic_context[n]->viewbox.x=MagickDoubleToLong(ceil(
+              GetDrawValue(token,&next_token)-0.5));
             if (token == next_token)
               ThrowPointExpectedException(token,exception);
             (void) GetNextToken(q,&q,extent,token);
             if (*token == ',')
               (void) GetNextToken(q,&q,extent,token);
-            graphic_context[n]->viewbox.y=(ssize_t) ceil(GetDrawValue(token,
-              &next_token)-0.5);
+            graphic_context[n]->viewbox.y=MagickDoubleToLong(ceil(
+              GetDrawValue(token,&next_token)-0.5));
             if (token == next_token)
               ThrowPointExpectedException(token,exception);
             (void) GetNextToken(q,&q,extent,token);
             if (*token == ',')
               (void) GetNextToken(q,&q,extent,token);
-            graphic_context[n]->viewbox.width=(size_t) floor(GetDrawValue(
-              token,&next_token)+0.5);
+            graphic_context[n]->viewbox.width=(size_t) MagickDoubleToLong(
+              floor(GetDrawValue(token,&next_token)+0.5));
             if (token == next_token)
               ThrowPointExpectedException(token,exception);
             (void) GetNextToken(q,&q,extent,token);
             if (*token == ',')
               (void) GetNextToken(q,&q,extent,token);
-            graphic_context[n]->viewbox.height=(size_t) floor(GetDrawValue(
-              token,&next_token)+0.5);
+            graphic_context[n]->viewbox.height=(size_t) MagickDoubleToLong(
+              floor(GetDrawValue(token,&next_token)+0.5));
             if (token == next_token)
               ThrowPointExpectedException(token,exception);
             break;
@@ -4073,7 +4076,7 @@
       case BezierPrimitive:
       {
         coordinates=(BezierQuantum*(double) primitive_info[j].coordinates);
-        if (primitive_info[j].coordinates > (108.0*BezierQuantum))
+        if (primitive_info[j].coordinates > (108*BezierQuantum))
           {
             (void) ThrowMagickException(exception,GetMagickModule(),DrawError,
               "TooManyBezierCoordinates","`%s'",token);
@@ -4981,8 +4984,8 @@
       /*
         Draw point.
       */
-      start_y=(ssize_t) ceil(bounds.y1-0.5);
-      stop_y=(ssize_t) floor(bounds.y2+0.5);
+      start_y=MagickDoubleToLong(ceil(bounds.y1-0.5));
+      stop_y=MagickDoubleToLong(floor(bounds.y2+0.5));
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
       #pragma omp parallel for schedule(static) shared(status) \
         magick_number_threads(image,image,stop_y-start_y+1,1)
@@ -5007,8 +5010,8 @@
 
         if (status == MagickFalse)
           continue;
-        start_x=(ssize_t) ceil(bounds.x1-0.5);
-        stop_x=(ssize_t) floor(bounds.x2+0.5);
+        start_x=MagickDoubleToLong(ceil(bounds.x1-0.5));
+        stop_x=MagickDoubleToLong(floor(bounds.x2+0.5));
         x=start_x;
         q=GetCacheViewAuthenticPixels(image_view,x,y,(size_t) (stop_x-x+1),1,
           exception);
@@ -5020,8 +5023,8 @@
         GetPixelInfo(image,&pixel);
         for ( ; x <= stop_x; x++)
         {
-          if ((x == (ssize_t) ceil(primitive_info->point.x-0.5)) &&
-              (y == (ssize_t) ceil(primitive_info->point.y-0.5)))
+          if ((x == MagickDoubleToLong(ceil(primitive_info->point.x-0.5))) &&
+              (y == MagickDoubleToLong(ceil(primitive_info->point.y-0.5))))
             {
               GetFillColor(draw_info,x-start_x,y-start_y,&pixel,exception);
               SetPixelViaPixelInfo(image,&pixel,q);
@@ -5042,8 +5045,8 @@
   /*
     Draw polygon or line.
   */
-  start_y=(ssize_t) ceil(bounds.y1-0.5);
-  stop_y=(ssize_t) floor(bounds.y2+0.5);
+  start_y=MagickDoubleToLong(ceil(bounds.y1-0.5));
+  stop_y=MagickDoubleToLong(floor(bounds.y2+0.5));
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(static) shared(status) \
     magick_number_threads(image,image,stop_y-start_y+1,1)
@@ -5065,8 +5068,8 @@
 
     if (status == MagickFalse)
       continue;
-    start_x=(ssize_t) ceil(bounds.x1-0.5);
-    stop_x=(ssize_t) floor(bounds.x2+0.5);
+    start_x=MagickDoubleToLong(ceil(bounds.x1-0.5));
+    stop_x=MagickDoubleToLong(floor(bounds.x2+0.5));
     q=GetCacheViewAuthenticPixels(image_view,start_x,y,(size_t) (stop_x-start_x+
       1),1,exception);
     if (q == (Quantum *) NULL)
@@ -5167,8 +5170,8 @@
     coordinates,
     y;
 
-  x=(ssize_t) ceil(primitive_info->point.x-0.5);
-  y=(ssize_t) ceil(primitive_info->point.y-0.5);
+  x=MagickDoubleToLong(ceil(primitive_info->point.x-0.5));
+  y=MagickDoubleToLong(ceil(primitive_info->point.y-0.5));
   switch (primitive_info->primitive)
   {
     case AlphaPrimitive:
@@ -5281,8 +5284,8 @@
       status&=SetImageMask(image,CompositePixelMask,draw_info->composite_mask,
         exception);
     }
-  x=(ssize_t) ceil(primitive_info->point.x-0.5);
-  y=(ssize_t) ceil(primitive_info->point.y-0.5);
+  x=MagickDoubleToLong(ceil(primitive_info->point.x-0.5));
+  y=MagickDoubleToLong(ceil(primitive_info->point.y-0.5));
   image_view=AcquireAuthenticCacheView(image,exception);
   switch (primitive_info->primitive)
   {
@@ -5560,8 +5563,8 @@
       composite_images=DestroyImageList(composite_images);
       (void) SetImageProgressMonitor(composite_image,(MagickProgressMonitor)
         NULL,(void *) NULL);
-      x1=(ssize_t) ceil(primitive_info[1].point.x-0.5);
-      y1=(ssize_t) ceil(primitive_info[1].point.y-0.5);
+      x1=MagickDoubleToLong(ceil(primitive_info[1].point.x-0.5));
+      y1=MagickDoubleToLong(ceil(primitive_info[1].point.y-0.5));
       if (((x1 != 0L) && (x1 != (ssize_t) composite_image->columns)) ||
           ((y1 != 0L) && (y1 != (ssize_t) composite_image->rows)))
         {
@@ -6170,8 +6173,8 @@
   else
     if ((theta > 0.0) && (sweep == MagickFalse))
       theta-=2.0*MagickPI;
-  arc_segments=(size_t) ceil(fabs((double) (theta/(0.5*MagickPI+
-    MagickEpsilon))));
+  arc_segments=(size_t) MagickDoubleToLong(ceil(fabs((double) (theta/(0.5*
+    MagickPI+MagickEpsilon)))));
   status=MagickTrue;
   p=primitive_info;
   for (i=0; i < (ssize_t) arc_segments; i++)
@@ -7526,8 +7529,8 @@
           theta.q=atan2(box_q[2].y-center.y,box_q[2].x-center.x);
           if (theta.q < theta.p)
             theta.q+=2.0*MagickPI;
-          arc_segments=(size_t) ceil((double) ((theta.q-theta.p)/
-            (2.0*sqrt((double) (1.0/mid)))));
+          arc_segments=(size_t) MagickDoubleToLong(ceil((double) ((theta.
+            q-theta.p)/(2.0*sqrt((double) (1.0/mid))))));
           CheckPathExtent(MaxStrokePad,arc_segments+MaxStrokePad);
           stroke_q[q].x=box_q[1].x;
           stroke_q[q].y=box_q[1].y;
@@ -7599,8 +7602,8 @@
           theta.q=atan2(box_p[2].y-center.y,box_p[2].x-center.x);
           if (theta.p < theta.q)
             theta.p+=2.0*MagickPI;
-          arc_segments=(size_t) ceil((double) ((theta.p-theta.q)/
-            (2.0*sqrt((double) (1.0/mid)))));
+          arc_segments=(size_t) MagickDoubleToLong(ceil((double) ((theta.p-
+            theta.q)/(2.0*sqrt((double) (1.0/mid))))));
           CheckPathExtent(arc_segments+MaxStrokePad,MaxStrokePad);
           stroke_p[p++]=box_p[1];
           for (j=1; j < (ssize_t) arc_segments; j++)
diff --git a/MagickCore/effect.c b/MagickCore/effect.c
index 38f89c3..6b6621c 100644
--- a/MagickCore/effect.c
+++ b/MagickCore/effect.c
@@ -288,8 +288,8 @@
         center,
         j;
 
-      j=(ssize_t) ceil((double) width*(1.0-QuantumScale*
-        GetPixelIntensity(edge_image,r))-0.5);
+      j=MagickDoubleToLong(ceil((double) width*(1.0-QuantumScale*
+        GetPixelIntensity(edge_image,r))-0.5));
       if (j < 0)
         j=0;
       else
@@ -609,8 +609,8 @@
         center,
         j;
 
-      j=(ssize_t) ceil((double) width*(1.0-QuantumScale*
-        GetPixelIntensity(edge_image,r))-0.5);
+      j=MagickDoubleToLong(ceil((double) width*(1.0-QuantumScale*
+        GetPixelIntensity(edge_image,r))-0.5));
       if (j < 0)
         j=0;
       else
@@ -2402,8 +2402,10 @@
   point.y=(double) width*cos(DegreesToRadians(angle));
   for (i=0; i < (ssize_t) width; i++)
   {
-    offset[i].x=(ssize_t) ceil((double) (i*point.y)/hypot(point.x,point.y)-0.5);
-    offset[i].y=(ssize_t) ceil((double) (i*point.x)/hypot(point.x,point.y)-0.5);
+    offset[i].x=MagickDoubleToLong(ceil((double) (i*point.y)/
+      hypot(point.x,point.y)-0.5));
+    offset[i].y=MagickDoubleToLong(ceil((double) (i*point.x)/
+      hypot(point.x,point.y)-0.5));
   }
   /*
     Motion blur image.
diff --git a/MagickCore/gem.c b/MagickCore/gem.c
index 5767b57..a986276 100644
--- a/MagickCore/gem.c
+++ b/MagickCore/gem.c
@@ -692,7 +692,7 @@
       *blue=QuantumRange*v;
       return;
     }
-  i=(ssize_t) floor(6.0*hue);
+  i=MagickDoubleToLong(floor(6.0*hue));
   f=6.0*hue-i;
   if ((i & 0x01) != 0)
     f=1.0-f;
diff --git a/MagickCore/image-private.h b/MagickCore/image-private.h
index 6cd48c2..935eed5 100644
--- a/MagickCore/image-private.h
+++ b/MagickCore/image-private.h
@@ -55,6 +55,17 @@
   return((double) (MagickPI*degrees/180.0));
 }
 
+static inline ssize_t MagickDoubleToLong(const double value)
+{
+  if (IsNaN(value) != 0)
+    return(0);
+  if (value > (double) SSIZE_MAX)
+    return((ssize_t) SSIZE_MAX);
+  if (value < (double) -SSIZE_MAX)
+    return((ssize_t) -SSIZE_MAX);
+  return((ssize_t) value);
+}
+
 static inline double RadiansToDegrees(const double radians)
 {
   return((double) (180.0*radians/MagickPI));
diff --git a/MagickCore/image.c b/MagickCore/image.c
index b9fb946..e0919c0 100644
--- a/MagickCore/image.c
+++ b/MagickCore/image.c
@@ -281,19 +281,23 @@
       flags=ParseGeometry(option,&geometry_info);
       if ((flags & GreaterValue) != 0)
         {
-          if (image->delay > (size_t) floor(geometry_info.rho+0.5))
-            image->delay=(size_t) floor(geometry_info.rho+0.5);
+          if ((double) image->delay > floor(geometry_info.rho+0.5))
+            image->delay=(size_t) MagickDoubleToLong(floor(
+              geometry_info.rho+0.5));
         }
       else
         if ((flags & LessValue) != 0)
           {
-            if (image->delay < (size_t) floor(geometry_info.rho+0.5))
-              image->ticks_per_second=(ssize_t) floor(geometry_info.sigma+0.5);
+            if ((double) image->delay < floor(geometry_info.rho+0.5))
+              image->ticks_per_second=MagickDoubleToLong(floor(
+                geometry_info.sigma+0.5));
           }
         else
-          image->delay=(size_t) floor(geometry_info.rho+0.5);
+          image->delay=(size_t) MagickDoubleToLong(floor(
+            geometry_info.rho+0.5));
       if ((flags & SigmaValue) != 0)
-        image->ticks_per_second=(ssize_t) floor(geometry_info.sigma+0.5);
+        image->ticks_per_second=MagickDoubleToLong(floor(
+          geometry_info.sigma+0.5));
     }
   option=GetImageOption(image_info,"dispose");
   if (option != (const char *) NULL)
@@ -877,15 +881,19 @@
   scale=1.0;
   if (image->columns != 0)
     scale=(double) columns/(double) image->columns;
-  clone_image->page.width=(size_t) floor(scale*image->page.width+0.5);
-  clone_image->page.x=(ssize_t) ceil(scale*image->page.x-0.5);
-  clone_image->tile_offset.x=(ssize_t) ceil(scale*image->tile_offset.x-0.5);
+  clone_image->page.width=(size_t) MagickDoubleToLong(floor(scale*
+    image->page.width+0.5));
+  clone_image->page.x=MagickDoubleToLong(ceil(scale*image->page.x-0.5));
+  clone_image->tile_offset.x=MagickDoubleToLong(ceil(scale*
+    image->tile_offset.x-0.5));
   scale=1.0;
   if (image->rows != 0)
     scale=(double) rows/(double) image->rows;
-  clone_image->page.height=(size_t) floor(scale*image->page.height+0.5);
-  clone_image->page.y=(ssize_t) ceil(scale*image->page.y-0.5);
-  clone_image->tile_offset.y=(ssize_t) ceil(scale*image->tile_offset.y-0.5);
+  clone_image->page.height=(size_t) MagickDoubleToLong(floor(scale*
+    image->page.height+0.5));
+  clone_image->page.y=MagickDoubleToLong(ceil(scale*image->page.y-0.5));
+  clone_image->tile_offset.y=MagickDoubleToLong(ceil(scale*
+    image->tile_offset.y-0.5));
   clone_image->cache=ClonePixelCache(image->cache);
   if (SetImageExtent(clone_image,columns,rows,exception) == MagickFalse)
     clone_image=DestroyImage(clone_image);
diff --git a/MagickCore/pixel.c b/MagickCore/pixel.c
index 529567a..5e345ee 100644
--- a/MagickCore/pixel.c
+++ b/MagickCore/pixel.c
@@ -4524,8 +4524,8 @@
   status=MagickTrue;
   *pixel=0.0;
   traits=GetPixelChannelTraits(image,channel);
-  x_offset=(ssize_t) floor(ConstrainPixelOffset(x));
-  y_offset=(ssize_t) floor(ConstrainPixelOffset(y));
+  x_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(x)));
+  y_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(y)));
   interpolate=method;
   if (interpolate == UndefinedInterpolatePixel)
     interpolate=image->interpolate;
@@ -4542,8 +4542,8 @@
       if (interpolate == Average9InterpolatePixel)
         {
           count=3;
-          x_offset=(ssize_t) (floor(ConstrainPixelOffset(x)+0.5)-1);
-          y_offset=(ssize_t) (floor(ConstrainPixelOffset(y)+0.5)-1);
+          x_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(x)+0.5)-1.0);
+          y_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(y)+0.5)-1.0);
         }
       else
         if (interpolate == Average16InterpolatePixel)
@@ -4726,8 +4726,8 @@
     }
     case NearestInterpolatePixel:
     {
-      x_offset=(ssize_t) floor(ConstrainPixelOffset(x)+0.5);
-      y_offset=(ssize_t) floor(ConstrainPixelOffset(y)+0.5);
+      x_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(x)+0.5));
+      y_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(y)+0.5));
       p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
       if (p == (const Quantum *) NULL)
         {
@@ -4944,8 +4944,8 @@
   assert(source->signature == MagickCoreSignature);
   assert(source_view != (CacheView *) NULL);
   status=MagickTrue;
-  x_offset=(ssize_t) floor(ConstrainPixelOffset(x));
-  y_offset=(ssize_t) floor(ConstrainPixelOffset(y));
+  x_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(x)));
+  y_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(y)));
   interpolate=method;
   if (interpolate == UndefinedInterpolatePixel)
     interpolate=source->interpolate;
@@ -4962,8 +4962,8 @@
       if (interpolate == Average9InterpolatePixel)
         {
           count=3;
-          x_offset=(ssize_t) (floor(ConstrainPixelOffset(x)+0.5)-1);
-          y_offset=(ssize_t) (floor(ConstrainPixelOffset(y)+0.5)-1);
+          x_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(x)+0.5)-1.0);
+          y_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(y)+0.5)-1.0);
         }
       else
         if (interpolate == Average16InterpolatePixel)
@@ -5227,8 +5227,8 @@
     }
     case NearestInterpolatePixel:
     {
-      x_offset=(ssize_t) floor(ConstrainPixelOffset(x)+0.5);
-      y_offset=(ssize_t) floor(ConstrainPixelOffset(y)+0.5);
+      x_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(x)+0.5));
+      y_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(y)+0.5));
       p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
       if (p == (const Quantum *) NULL)
         {
@@ -5511,8 +5511,8 @@
   assert(image->signature == MagickCoreSignature);
   assert(image_view != (CacheView *) NULL);
   status=MagickTrue;
-  x_offset=(ssize_t) floor(ConstrainPixelOffset(x));
-  y_offset=(ssize_t) floor(ConstrainPixelOffset(y));
+  x_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(x)));
+  y_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(y)));
   interpolate=method;
   if (interpolate == UndefinedInterpolatePixel)
     interpolate=image->interpolate;
@@ -5531,8 +5531,8 @@
       if (interpolate == Average9InterpolatePixel)
         {
           count=3;
-          x_offset=(ssize_t) (floor(ConstrainPixelOffset(x)+0.5)-1);
-          y_offset=(ssize_t) (floor(ConstrainPixelOffset(y)+0.5)-1);
+          x_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(x)+0.5)-1.0);
+          y_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(y)+0.5)-1.0);
         }
       else if (interpolate == Average16InterpolatePixel)
         {
@@ -5856,8 +5856,8 @@
     }
     case NearestInterpolatePixel:
     {
-      x_offset=(ssize_t) floor(ConstrainPixelOffset(x)+0.5);
-      y_offset=(ssize_t) floor(ConstrainPixelOffset(y)+0.5);
+      x_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(x)+0.5));
+      y_offset=MagickDoubleToLong(floor(ConstrainPixelOffset(y)+0.5));
       p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
       if (p == (const Quantum *) NULL)
         {
diff --git a/MagickCore/property.c b/MagickCore/property.c
index 69c42a0..c08106f 100644
--- a/MagickCore/property.c
+++ b/MagickCore/property.c
@@ -4354,14 +4354,15 @@
           else
             if ((flags & LessValue) != 0)
               {
-                if (image->delay < (size_t) floor(geometry_info.rho+0.5))
-                  image->delay=(ssize_t)
-                    floor(geometry_info.sigma+0.5);
+                if ((double) image->delay < floor(geometry_info.rho+0.5))
+                  image->delay=MagickDoubleToLong(
+                    floor(geometry_info.sigma+0.5));
               }
             else
               image->delay=(size_t) floor(geometry_info.rho+0.5);
           if ((flags & SigmaValue) != 0)
-            image->ticks_per_second=(ssize_t) floor(geometry_info.sigma+0.5);
+            image->ticks_per_second=MagickDoubleToLong(floor(
+              geometry_info.sigma+0.5));
           return(MagickTrue);
         }
       if (LocaleCompare("delay_units",property) == 0)
diff --git a/MagickCore/segment.c b/MagickCore/segment.c
index ba10779..4850053 100644
--- a/MagickCore/segment.c
+++ b/MagickCore/segment.c
@@ -331,7 +331,7 @@
           }
         else
           {
-            cluster=(Cluster *) AcquireMagickMemory(sizeof(*cluster));
+            cluster=(Cluster *) AcquireQuantumMemory(1,sizeof(*cluster));
             head=cluster;
           }
         if (cluster == (Cluster *) NULL)
@@ -353,7 +353,7 @@
       /*
         No classes were identified-- create one.
       */
-      cluster=(Cluster *) AcquireMagickMemory(sizeof(*cluster));
+      cluster=(Cluster *) AcquireQuantumMemory(1,sizeof(*cluster));
       if (cluster == (Cluster *) NULL)
         ThrowClassifyException(ResourceLimitError,"MemoryAllocationFailed",
           image->filename);
@@ -387,30 +387,27 @@
       break;
     for (x=0; x < (ssize_t) image->columns; x++)
     {
+      PixelInfo
+        pixel;
+
+      pixel.red=(double) ScaleQuantumToChar(GetPixelRed(image,p));
+      pixel.green=(double) ScaleQuantumToChar(GetPixelGreen(image,p));
+      pixel.blue=(double) ScaleQuantumToChar(GetPixelBlue(image,p));
       for (cluster=head; cluster != (Cluster *) NULL; cluster=cluster->next)
-        if (((ssize_t) ScaleQuantumToChar(GetPixelRed(image,p)) >=
-             (cluster->red.left-SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelRed(image,p)) <=
-             (cluster->red.right+SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelGreen(image,p)) >=
-             (cluster->green.left-SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelGreen(image,p)) <=
-             (cluster->green.right+SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelBlue(image,p)) >=
-             (cluster->blue.left-SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelBlue(image,p)) <=
-             (cluster->blue.right+SafeMargin)))
+        if ((pixel.red >= (double) (cluster->red.left-SafeMargin)) &&
+            (pixel.red <= (double) (cluster->red.right+SafeMargin)) &&
+            (pixel.green >= (double) (cluster->green.left-SafeMargin)) &&
+            (pixel.green <= (double) (cluster->green.right+SafeMargin)) &&
+            (pixel.blue >= (double) (cluster->blue.left-SafeMargin)) &&
+            (pixel.blue <= (double) (cluster->blue.right+SafeMargin)))
           {
             /*
               Count this pixel.
             */
             count++;
-            cluster->red.center+=(double) ScaleQuantumToChar(
-              GetPixelRed(image,p));
-            cluster->green.center+=(double) ScaleQuantumToChar(
-              GetPixelGreen(image,p));
-            cluster->blue.center+=(double) ScaleQuantumToChar(
-              GetPixelBlue(image,p));
+            cluster->red.center+=pixel.red;
+            cluster->green.center+=pixel.green;
+            cluster->blue.center+=pixel.blue;
             cluster->count++;
             break;
           }
@@ -557,7 +554,7 @@
   for (y=0; y < (ssize_t) image->rows; y++)
   {
     Cluster
-      *clust;
+      *cluster;
 
     register const PixelInfo
       *magick_restrict p;
@@ -578,30 +575,30 @@
       }
     for (x=0; x < (ssize_t) image->columns; x++)
     {
+      PixelInfo
+        pixel;
+
       SetPixelIndex(image,(Quantum) 0,q);
-      for (clust=head; clust != (Cluster *) NULL; clust=clust->next)
+      pixel.red=(double) ScaleQuantumToChar(GetPixelRed(image,q));
+      pixel.green=(double) ScaleQuantumToChar(GetPixelGreen(image,q));
+      pixel.blue=(double) ScaleQuantumToChar(GetPixelBlue(image,q));
+      for (cluster=head; cluster != (Cluster *) NULL; cluster=cluster->next)
       {
-        if (((ssize_t) ScaleQuantumToChar(GetPixelRed(image,q)) >=
-             (clust->red.left-SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelRed(image,q)) <=
-             (clust->red.right+SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelGreen(image,q)) >=
-             (clust->green.left-SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelGreen(image,q)) <=
-             (clust->green.right+SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelBlue(image,q)) >=
-             (clust->blue.left-SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelBlue(image,q)) <=
-             (clust->blue.right+SafeMargin)))
+        if ((pixel.red >= (double) (cluster->red.left-SafeMargin)) &&
+            (pixel.red <= (double) (cluster->red.right+SafeMargin)) &&
+            (pixel.green >= (double) (cluster->green.left-SafeMargin)) &&
+            (pixel.green <= (double) (cluster->green.right+SafeMargin)) &&
+            (pixel.blue >= (double) (cluster->blue.left-SafeMargin)) &&
+            (pixel.blue <= (double) (cluster->blue.right+SafeMargin)))
           {
             /*
               Classify this pixel.
             */
-            SetPixelIndex(image,(Quantum) clust->id,q);
+            SetPixelIndex(image,(Quantum) cluster->id,q);
             break;
           }
       }
-      if (clust == (Cluster *) NULL)
+      if (cluster == (Cluster *) NULL)
         {
           double
             distance_squared,
@@ -622,24 +619,18 @@
           {
             sum=0.0;
             p=image->colormap+j;
-            distance_squared=squares[(ssize_t) ScaleQuantumToChar(
-              GetPixelRed(image,q))-(ssize_t)
-              ScaleQuantumToChar(ClampToQuantum(p->red))]+squares[(ssize_t)
-              ScaleQuantumToChar(GetPixelGreen(image,q))-(ssize_t)
-              ScaleQuantumToChar(ClampToQuantum(p->green))]+squares[(ssize_t)
-              ScaleQuantumToChar(GetPixelBlue(image,q))-(ssize_t)
-              ScaleQuantumToChar(ClampToQuantum(p->blue))];
+            distance_squared=
+              squares[(ssize_t) (pixel.red-ScaleQuantumToChar(p->red))]+
+              squares[(ssize_t) (pixel.green-ScaleQuantumToChar(p->green))]+
+              squares[(ssize_t) (pixel.blue-ScaleQuantumToChar(p->blue))];
             numerator=distance_squared;
             for (k=0; k < (ssize_t) image->colors; k++)
             {
               p=image->colormap+k;
-                distance_squared=squares[(ssize_t) ScaleQuantumToChar(
-                  GetPixelRed(image,q))-(ssize_t)
-                  ScaleQuantumToChar(ClampToQuantum(p->red))]+squares[
-                  (ssize_t) ScaleQuantumToChar(GetPixelGreen(image,q))-(ssize_t)
-                  ScaleQuantumToChar(ClampToQuantum(p->green))]+squares[
-                  (ssize_t) ScaleQuantumToChar(GetPixelBlue(image,q))-(ssize_t)
-                  ScaleQuantumToChar(ClampToQuantum(p->blue))];
+              distance_squared=
+                squares[(ssize_t) (pixel.red-ScaleQuantumToChar(p->red))]+
+                squares[(ssize_t) (pixel.green-ScaleQuantumToChar(p->green))]+
+                squares[(ssize_t) (pixel.blue-ScaleQuantumToChar(p->blue))];
               ratio=numerator/distance_squared;
               sum+=SegmentPower(ratio);
             }
@@ -1043,7 +1034,7 @@
           }
         else
           {
-            cluster=(Cluster *) AcquireMagickMemory(sizeof(*cluster));
+            cluster=(Cluster *) AcquireQuantumMemory(1,sizeof(*cluster));
             head=cluster;
           }
         if (cluster == (Cluster *) NULL)
@@ -1069,7 +1060,7 @@
       /*
         No classes were identified-- create one.
       */
-      cluster=(Cluster *) AcquireMagickMemory(sizeof(*cluster));
+      cluster=(Cluster *) AcquireQuantumMemory(1,sizeof(*cluster));
       if (cluster == (Cluster *) NULL)
         {
           (void) ThrowMagickException(exception,GetMagickModule(),
@@ -1097,30 +1088,27 @@
       break;
     for (x=0; x < (ssize_t) image->columns; x++)
     {
+      PixelInfo
+        pixel;
+
+      pixel.red=(double) ScaleQuantumToChar(GetPixelRed(image,p));
+      pixel.green=(double) ScaleQuantumToChar(GetPixelGreen(image,p));
+      pixel.blue=(double) ScaleQuantumToChar(GetPixelBlue(image,p));
       for (cluster=head; cluster != (Cluster *) NULL; cluster=cluster->next)
-        if (((ssize_t) ScaleQuantumToChar(GetPixelRed(image,p)) >=
-             (cluster->red.left-SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelRed(image,p)) <=
-             (cluster->red.right+SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelGreen(image,p)) >=
-             (cluster->green.left-SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelGreen(image,p)) <=
-             (cluster->green.right+SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelBlue(image,p)) >=
-             (cluster->blue.left-SafeMargin)) &&
-            ((ssize_t) ScaleQuantumToChar(GetPixelBlue(image,p)) <=
-             (cluster->blue.right+SafeMargin)))
+        if ((pixel.red >= (double) (cluster->red.left-SafeMargin)) &&
+            (pixel.red <= (double) (cluster->red.right+SafeMargin)) &&
+            (pixel.green >= (double) (cluster->green.left-SafeMargin)) &&
+            (pixel.green <= (double) (cluster->green.right+SafeMargin)) &&
+            (pixel.blue >= (double) (cluster->blue.left-SafeMargin)) &&
+            (pixel.blue <= (double) (cluster->blue.right+SafeMargin)))
           {
             /*
               Count this pixel.
             */
             count++;
-            cluster->red.center+=(double) ScaleQuantumToChar(
-              GetPixelRed(image,p));
-            cluster->green.center+=(double) ScaleQuantumToChar(
-              GetPixelGreen(image,p));
-            cluster->blue.center+=(double) ScaleQuantumToChar(
-              GetPixelBlue(image,p));
+            cluster->red.center+=pixel.red;
+            cluster->green.center+=pixel.green;
+            cluster->blue.center+=pixel.blue;
             cluster->count++;
             break;
           }
@@ -1635,7 +1623,7 @@
       return(0.0);
     }
   /*
-    Find active nodes:  stability is greater (or equal) to the mean stability of
+    Find active nodes: Stability is greater (or equal) to the mean stability of
     its children.
   */
   number_nodes=0;
@@ -1729,7 +1717,6 @@
 %      of pixels for each intensity of a particular color component.
 %
 */
-
 static void ScaleSpace(const ssize_t *histogram,const double tau,
   double *scale_histogram)
 {
diff --git a/MagickCore/shear.c b/MagickCore/shear.c
index 8b5ff3c..6552070 100644
--- a/MagickCore/shear.c
+++ b/MagickCore/shear.c
@@ -163,10 +163,10 @@
     if (max.y < extent[i].y)
       max.y=extent[i].y;
   }
-  geometry.x=(ssize_t) ceil(min.x-0.5);
-  geometry.y=(ssize_t) ceil(min.y-0.5);
-  geometry.width=(size_t) floor(max.x-min.x+0.5);
-  geometry.height=(size_t) floor(max.y-min.y+0.5);
+  geometry.x=MagickDoubleToLong(ceil(min.x-0.5));
+  geometry.y=MagickDoubleToLong(ceil(min.y-0.5));
+  geometry.width=(size_t) MagickDoubleToLong(floor(max.x-min.x+0.5));
+  geometry.height=(size_t) MagickDoubleToLong(floor(max.y-min.y+0.5));
   page=(*image)->page;
   (void) ParseAbsoluteGeometry("0x0+0+0",&(*image)->page);
   crop_image=CropImage(*image,&geometry,exception);
@@ -1217,7 +1217,7 @@
         displacement*=(-1.0);
         direction=LEFT;
       }
-    step=(ssize_t) floor((double) displacement);
+    step=MagickDoubleToLong(floor((double) displacement));
     area=(double) (displacement-step);
     step++;
     pixel=background;
@@ -1434,7 +1434,7 @@
         displacement*=(-1.0);
         direction=UP;
       }
-    step=(ssize_t) floor((double) displacement);
+    step=MagickDoubleToLong(floor((double) displacement));
     area=(double) (displacement-step);
     step++;
     pixel=background;
@@ -1617,11 +1617,12 @@
   /*
     Compute image size.
   */
-  bounds.width=image->columns+(ssize_t) floor(fabs(shear.x)*image->rows+0.5);
-  bounds.x=(ssize_t) ceil((double) image->columns+((fabs(shear.x)*image->rows)-
-    image->columns)/2.0-0.5);
-  bounds.y=(ssize_t) ceil((double) image->rows+((fabs(shear.y)*bounds.width)-
-    image->rows)/2.0-0.5);
+  bounds.width=image->columns+MagickDoubleToLong(floor(fabs(shear.x)*
+    image->rows+0.5));
+  bounds.x=MagickDoubleToLong(ceil((double) image->columns+((fabs(shear.x)*
+    image->rows)-image->columns)/2.0-0.5));
+  bounds.y=MagickDoubleToLong(ceil((double) image->rows+((fabs(shear.y)*
+    bounds.width)-image->rows)/2.0-0.5));
   /*
     Surround image with border.
   */
@@ -1769,9 +1770,9 @@
   bounds.height=(size_t) floor(fabs((double) bounds.width*shear.y)+height+0.5);
   shear_width=(size_t) floor(fabs((double) bounds.height*shear.x)+
     bounds.width+0.5);
-  bounds.x=(ssize_t) floor((double) ((shear_width > bounds.width) ? width :
-    bounds.width-shear_width+2)/2.0+0.5);
-  bounds.y=(ssize_t) floor(((double) bounds.height-height+2)/2.0+0.5);
+  bounds.x=MagickDoubleToLong(floor((double) ((shear_width > bounds.width) ?
+    width : bounds.width-shear_width+2)/2.0+0.5));
+  bounds.y=MagickDoubleToLong(floor(((double) bounds.height-height+2)/2.0+0.5));
   /*
     Surround image with a border.
   */
diff --git a/MagickCore/visual-effects.c b/MagickCore/visual-effects.c
index e8b13aa..517f24e 100644
--- a/MagickCore/visual-effects.c
+++ b/MagickCore/visual-effects.c
@@ -1437,8 +1437,8 @@
       */
       depth--;
       attenuate++;
-      x_mid=(ssize_t) ceil((segment->x1+segment->x2)/2-0.5);
-      y_mid=(ssize_t) ceil((segment->y1+segment->y2)/2-0.5);
+      x_mid=MagickDoubleToLong(ceil((segment->x1+segment->x2)/2-0.5));
+      y_mid=MagickDoubleToLong(ceil((segment->y1+segment->y2)/2-0.5));
       local_info=(*segment);
       local_info.x2=(double) x_mid;
       local_info.y2=(double) y_mid;
@@ -1461,8 +1461,8 @@
         &local_info,attenuate,depth,exception);
       return(status == 0 ? MagickFalse : MagickTrue);
     }
-  x_mid=(ssize_t) ceil((segment->x1+segment->x2)/2-0.5);
-  y_mid=(ssize_t) ceil((segment->y1+segment->y2)/2-0.5);
+  x_mid=MagickDoubleToLong(ceil((segment->x1+segment->x2)/2-0.5));
+  y_mid=MagickDoubleToLong(ceil((segment->y1+segment->y2)/2-0.5));
   if ((fabs(segment->x1-x_mid) < MagickEpsilon) &&
       (fabs(segment->x2-x_mid) < MagickEpsilon) &&
       (fabs(segment->y1-y_mid) < MagickEpsilon) &&
@@ -1479,11 +1479,11 @@
       /*
         Left pixel.
       */
-      x=(ssize_t) ceil(segment->x1-0.5);
-      u=GetCacheViewVirtualPixels(u_view,x,(ssize_t) ceil(segment->y1-0.5),1,1,
-        exception);
-      v=GetCacheViewVirtualPixels(v_view,x,(ssize_t) ceil(segment->y2-0.5),1,1,
-        exception);
+      x=MagickDoubleToLong(ceil(segment->x1-0.5));
+      u=GetCacheViewVirtualPixels(u_view,x,MagickDoubleToLong(ceil(
+        segment->y1-0.5)),1,1,exception);
+      v=GetCacheViewVirtualPixels(v_view,x,MagickDoubleToLong(ceil(
+        segment->y2-0.5)),1,1,exception);
       q=QueueCacheViewAuthenticPixels(image_view,x,y_mid,1,1,exception);
       if ((u == (const Quantum *) NULL) || (v == (const Quantum *) NULL) ||
           (q == (Quantum *) NULL))
@@ -1502,11 +1502,11 @@
           /*
             Right pixel.
           */
-          x=(ssize_t) ceil(segment->x2-0.5);
-          u=GetCacheViewVirtualPixels(u_view,x,(ssize_t) ceil(segment->y1-0.5),
-            1,1,exception);
-          v=GetCacheViewVirtualPixels(v_view,x,(ssize_t) ceil(segment->y2-0.5),
-            1,1,exception);
+          x=MagickDoubleToLong(ceil(segment->x2-0.5));
+          u=GetCacheViewVirtualPixels(u_view,x,MagickDoubleToLong(ceil(
+            segment->y1-0.5)),1,1,exception);
+          v=GetCacheViewVirtualPixels(v_view,x,MagickDoubleToLong(ceil(
+            segment->y2-0.5)),1,1,exception);
           q=QueueCacheViewAuthenticPixels(image_view,x,y_mid,1,1,exception);
           if ((u == (const Quantum *) NULL) || (v == (const Quantum *) NULL) ||
               (q == (Quantum *) NULL))
@@ -1531,11 +1531,11 @@
           /*
             Bottom pixel.
           */
-          y=(ssize_t) ceil(segment->y2-0.5);
-          u=GetCacheViewVirtualPixels(u_view,(ssize_t) ceil(segment->x1-0.5),y,
-            1,1,exception);
-          v=GetCacheViewVirtualPixels(v_view,(ssize_t) ceil(segment->x2-0.5),y,
-            1,1,exception);
+          y=MagickDoubleToLong(ceil(segment->y2-0.5));
+          u=GetCacheViewVirtualPixels(u_view,MagickDoubleToLong(ceil(
+            segment->x1-0.5)),y,1,1,exception);
+          v=GetCacheViewVirtualPixels(v_view,MagickDoubleToLong(ceil(
+            segment->x2-0.5)),y,1,1,exception);
           q=QueueCacheViewAuthenticPixels(image_view,x_mid,y,1,1,exception);
           if ((u == (const Quantum *) NULL) || (v == (const Quantum *) NULL) ||
               (q == (Quantum *) NULL))
@@ -1555,11 +1555,11 @@
           /*
             Top pixel.
           */
-          y=(ssize_t) ceil(segment->y1-0.5);
-          u=GetCacheViewVirtualPixels(u_view,(ssize_t) ceil(segment->x1-0.5),y,
-            1,1,exception);
-          v=GetCacheViewVirtualPixels(v_view,(ssize_t) ceil(segment->x2-0.5),y,
-            1,1,exception);
+          y=MagickDoubleToLong(ceil(segment->y1-0.5));
+          u=GetCacheViewVirtualPixels(u_view,MagickDoubleToLong(ceil(
+            segment->x1-0.5)),y,1,1,exception);
+          v=GetCacheViewVirtualPixels(v_view,MagickDoubleToLong(ceil(
+            segment->x2-0.5)),y,1,1,exception);
           q=QueueCacheViewAuthenticPixels(image_view,x_mid,y,1,1,exception);
           if ((u == (const Quantum *) NULL) || (v == (const Quantum *) NULL) ||
               (q == (Quantum *) NULL))
@@ -1581,11 +1581,11 @@
       /*
         Middle pixel.
       */
-      x=(ssize_t) ceil(segment->x1-0.5);
-      y=(ssize_t) ceil(segment->y1-0.5);
+      x=MagickDoubleToLong(ceil(segment->x1-0.5));
+      y=MagickDoubleToLong(ceil(segment->y1-0.5));
       u=GetCacheViewVirtualPixels(u_view,x,y,1,1,exception);
-      x=(ssize_t) ceil(segment->x2-0.5);
-      y=(ssize_t) ceil(segment->y2-0.5);
+      x=MagickDoubleToLong(ceil(segment->x2-0.5));
+      y=MagickDoubleToLong(ceil(segment->y2-0.5));
       v=GetCacheViewVirtualPixels(v_view,x,y,1,1,exception);
       q=QueueCacheViewAuthenticPixels(image_view,x_mid,y_mid,1,1,exception);
       if ((u == (const Quantum *) NULL) || (v == (const Quantum *) NULL) ||