Commit 9b1840d26 for imagemagick.org

commit 9b1840d2688603bb559eaa4b29f657504c8a6b62
Author: Cristy <urban-warrior@imagemagick.org>
Date:   Sat Mar 14 20:15:19 2026 -0400

    correct kernel width casting

diff --git a/MagickCore/morphology.c b/MagickCore/morphology.c
index 77fc3cdf8..ea26261dd 100644
--- a/MagickCore/morphology.c
+++ b/MagickCore/morphology.c
@@ -100,9 +100,9 @@ static inline size_t fact(size_t n)
   return(f);
 }
 #elif 1 /* glibc floating point alternatives */
-#define fact(n) (CastDoubleToSizeT(tgamma((double)n+1.0))
+#define fact(n) (CastDoubleToSizeT(tgamma((double) n+1)))
 #else
-#define fact(n) (CastDoubleToSizeTlgamma((double)n+1.0))
+#define fact(n) (CastDoubleToSizeT(lgamma((double) n+1)))
 #endif


@@ -306,7 +306,7 @@ static KernelInfo *ParseKernelArray(const char *kernel_string)
           (void) GetNextToken(p,&p,MagickPathExtent,token);
       }
       /* set the size of the kernel - old sized square */
-      kernel->width = kernel->height= CastDoubleToSizeT(sqrt((double) i+1.0));
+      kernel->width = kernel->height=CastDoubleToSizeT(sqrt((double) i+1.0));
       kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
       p=(const char *) kernel_string;
       while ((isspace((int) ((unsigned char) *p)) != 0) || (*p == '\''))
@@ -1059,7 +1059,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
           A, B, R;

         if ( args->rho >= 1.0 )
-          kernel->width = CastDoubleToSizeT(args->rho*2.0+1.0);
+          kernel->width = CastDoubleToSizeT(args->rho)*2+1;
         else if ( (type != DoGKernel) || (sigma >= sigma2) )
           kernel->width = GetOptimalKernelWidth2D(args->rho,sigma);
         else
@@ -1151,7 +1151,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
           alpha, beta;

         if ( args->rho >= 1.0 )
-          kernel->width = CastDoubleToSizeT(args->rho*2.0+1.0);
+          kernel->width = CastDoubleToSizeT(args->rho)*2+1;
         else
           kernel->width = GetOptimalKernelWidth1D(args->rho,sigma);
         kernel->height = 1;
@@ -1310,7 +1310,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
         if (args->rho < 1.0)
           kernel->width = kernel->height = 3;  /* default radius = 1 */
         else
-          kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2.0+1.0);
+          kernel->width = kernel->height = CastDoubleToSizeT(args->rho)*2+1;
         kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;

         order_f = fact(kernel->width-1);
@@ -1547,7 +1547,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
         if (args->rho < 1.0)
           kernel->width = kernel->height = 3;  /* default radius = 1 */
         else
-          kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2.0+1.0);
+          kernel->width = kernel->height = CastDoubleToSizeT(args->rho)*2+1;
         kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;

         kernel->values=(MagickRealType *) MagickAssumeAligned(
@@ -1575,7 +1575,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
             if (args->rho < 1.0)
               kernel->width = kernel->height = 3;  /* default radius = 1 */
             else
-              kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2.0+1.0);
+              kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2+1);
             kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;
             scale = args->sigma;
           }
@@ -1611,7 +1611,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
           if (args->rho < 1.0)
             kernel->width = kernel->height = 5;  /* default radius = 2 */
           else
-            kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2.0+1.0);
+            kernel->width = kernel->height = CastDoubleToSizeT(args->rho)*2+1;
           kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;

           kernel->values=(MagickRealType *) MagickAssumeAligned(
@@ -1633,12 +1633,12 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
       case DiskKernel:
         {
           ssize_t
-            limit = CastDoubleToSsizeT(args->rho*args->rho);
+            limit = (ssize_t)(args->rho*args->rho);

           if (args->rho < 0.4)           /* default radius approx 4.3 */
             kernel->width = kernel->height = 9L, limit = 18L;
           else
-            kernel->width = kernel->height = CastDoubleToSizeT(fabs(args->rho)*2.0+1.0);
+            kernel->width = kernel->height = CastDoubleToSizeT(fabs(args->rho))*2+1;
           kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;

           kernel->values=(MagickRealType *) MagickAssumeAligned(
@@ -1661,7 +1661,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
           if (args->rho < 1.0)
             kernel->width = kernel->height = 5;  /* default radius 2 */
           else
-            kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2.0+1.0);
+            kernel->width = kernel->height = CastDoubleToSizeT(args->rho)*2+1;
           kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;

           kernel->values=(MagickRealType *) MagickAssumeAligned(
@@ -1683,7 +1683,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
           if (args->rho < 1.0)
             kernel->width = kernel->height = 5;  /* default radius 2 */
           else
-            kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2.0+1.0);
+            kernel->width = kernel->height = CastDoubleToSizeT(args->rho)*2+1;
           kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;

           kernel->values=(MagickRealType *) MagickAssumeAligned(
@@ -1713,15 +1713,15 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,

           if (args->rho < args->sigma)
             {
-              kernel->width = CastDoubleToSizeT(args->sigma*2.0+1.0);
-              limit1 = CastDoubleToSsizeT(args->rho*args->rho);
-              limit2 = CastDoubleToSsizeT(args->sigma*args->sigma);
+              kernel->width = CastDoubleToSizeT(args->sigma)*2+1;
+              limit1 = (ssize_t)(args->rho*args->rho);
+              limit2 = (ssize_t)(args->sigma*args->sigma);
             }
           else
             {
-              kernel->width = CastDoubleToSizeT(args->rho*2.0+1.0);
-              limit1 = CastDoubleToSsizeT(args->sigma*args->sigma);
-              limit2 = CastDoubleToSsizeT(args->rho*args->rho);
+              kernel->width = CastDoubleToSizeT(args->rho)*2+1;
+              limit1 = (ssize_t)(args->sigma*args->sigma);
+              limit2 = (ssize_t)(args->rho*args->rho);
             }
           if ( limit2 <= 0 )
             kernel->width = 7L, limit1 = 7L, limit2 = 11L;
@@ -2100,7 +2100,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
           if (args->rho < 1.0)
             kernel->width = kernel->height = 3;  /* default radius = 1 */
           else
-            kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2.0+1.0);
+            kernel->width = kernel->height = CastDoubleToSizeT(args->rho)*2+1;
           kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;

           kernel->values=(MagickRealType *) MagickAssumeAligned(
@@ -2121,7 +2121,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
           if (args->rho < 1.0)
             kernel->width = kernel->height = 3;  /* default radius = 1 */
           else
-            kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2.0+1.0);
+            kernel->width = kernel->height = CastDoubleToSizeT(args->rho)*2+1;
           kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;

           kernel->values=(MagickRealType *) MagickAssumeAligned(
@@ -2142,7 +2142,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
         if (args->rho < 2.0)
           kernel->width = kernel->height = 5;  /* default/minimum radius = 2 */
         else
-          kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2.0+1.0);
+          kernel->width = kernel->height = CastDoubleToSizeT(args->rho)*2+1;
         kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;

         kernel->values=(MagickRealType *) MagickAssumeAligned(
@@ -2168,7 +2168,7 @@ MagickExport KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
         if (args->rho < 1.0)
           kernel->width = kernel->height = 3;  /* default radius = 1 */
         else
-          kernel->width = kernel->height = CastDoubleToSizeT(args->rho*2.0+1.0);
+          kernel->width = kernel->height = CastDoubleToSizeT(args->rho)*2+1;
         kernel->x = kernel->y = (ssize_t) (kernel->width-1)/2;

         kernel->values=(MagickRealType *) MagickAssumeAligned(