Commit c7170954b for imagemagick.org

commit c7170954b22ab07ab15d2f912a4aae3eb0cba273
Author: Cristy <urban-warrior@imagemagick.org>
Date:   Sat Aug 29 10:21:05 2026 -0400

    https://github.com/ImageMagick/ImageMagick/issues/8927

diff --git a/MagickCore/transform.c b/MagickCore/transform.c
index 5e47edbe9..02929c154 100644
--- a/MagickCore/transform.c
+++ b/MagickCore/transform.c
@@ -2471,8 +2471,7 @@ MagickExport Image *TrimImage(const Image *image,ExceptionInfo *exception)
     *trim_image;

   RectangleInfo
-    geometry,
-    page;
+    geometry;

   assert(image != (const Image *) NULL);
   assert(image->signature == MagickCoreSignature);
@@ -2481,87 +2480,120 @@ MagickExport Image *TrimImage(const Image *image,ExceptionInfo *exception)
   geometry=GetImageBoundingBox(image,exception);
   if ((geometry.width == 0) || (geometry.height == 0))
     {
-      Image
-        *crop_image;
-
-      crop_image=CloneImage(image,1,1,MagickTrue,exception);
-      if (crop_image == (Image *) NULL)
-        return((Image *) NULL);
-      crop_image->background_color.alpha_trait=BlendPixelTrait;
-      crop_image->background_color.alpha=(MagickRealType) TransparentAlpha;
-      (void) SetImageBackgroundColor(crop_image,exception);
-      crop_image->page=image->page;
-      crop_image->page.x=(-1);
-      crop_image->page.y=(-1);
-      return(crop_image);
+      /*
+        The image is empty: return a minimal 1x1 transparent placeholder.
+      */
+      trim_image=CloneImage(image,1,1,MagickTrue,exception);
+      if (trim_image != (Image *) NULL)
+        {
+          trim_image->background_color.alpha_trait=BlendPixelTrait;
+          trim_image->background_color.alpha=(MagickRealType) TransparentAlpha;
+          (void) SetImageBackgroundColor(trim_image,exception);
+          trim_image->page.width=image->columns;
+          trim_image->page.height=image->rows;
+          trim_image->page.x=(-1);
+          trim_image->page.y=(-1);
+        }
+      return(trim_image);
     }
-  page=geometry;
   artifact=GetImageArtifact(image,"trim:minSize");
   if (artifact != (const char *) NULL)
-    (void) ParseAbsoluteGeometry(artifact,&page);
-  if ((geometry.width < page.width) && (geometry.height < page.height))
     {
+      RectangleInfo
+        minSize;
+
       /*
-        Limit trim to a minimum size.
+        Ensure trim is not less than min size dimensions relative to gravity.
       */
-      switch (image->gravity)
-      {
-        case CenterGravity:
-        {
-          geometry.x-=((ssize_t) page.width-(ssize_t) geometry.width)/2;
-          geometry.y-=((ssize_t) page.height-(ssize_t) geometry.height)/2;
-          break;
-        }
-        case NorthWestGravity:
-        {
-          geometry.x-=((ssize_t) page.width-(ssize_t) geometry.width);
-          geometry.y-=((ssize_t) page.height-(ssize_t) geometry.height);
-          break;
-        }
-        case NorthGravity:
-        {
-          geometry.x-=((ssize_t) page.width-(ssize_t) geometry.width)/2;
-          geometry.y-=((ssize_t) page.height-(ssize_t) geometry.height);
-          break;
-        }
-        case NorthEastGravity:
-        {
-          geometry.y-=((ssize_t) page.height-(ssize_t) geometry.height);
-          break;
-        }
-        case EastGravity:
+      minSize=geometry;
+      (void) ParseAbsoluteGeometry(artifact,&minSize);
+      if ((geometry.width < minSize.width) ||
+          (geometry.height < minSize.height))
         {
-          geometry.y-=((ssize_t) page.height-(ssize_t) geometry.height)/2;
-          break;
-        }
-        case SouthEastGravity:
-          break;
-        case SouthGravity:
-        {
-          geometry.x-=((ssize_t) page.width-(ssize_t) geometry.width)/2;
-          break;
-        }
-        case SouthWestGravity:
-        {
-          geometry.x-=((ssize_t) page.width-(ssize_t) geometry.width);
-          break;
-        }
-        case WestGravity:
-        {
-          geometry.x-=((ssize_t) page.width-(ssize_t) geometry.width);
-          geometry.y-=((ssize_t) page.height-(ssize_t) geometry.height)/2;
-          break;
+          minSize.x=(geometry.width < minSize.width) ? (ssize_t)
+            (minSize.width-geometry.width) : 0;
+          minSize.y=(geometry.height < minSize.height) ? (ssize_t)
+            (minSize.height-geometry.height) : 0;
+          switch (image->gravity)
+          {
+            case NorthWestGravity:
+            {
+              geometry.x-=minSize.x;
+              geometry.y-=minSize.y;
+              break;
+            }
+            case NorthGravity:
+            {
+              geometry.x-=minSize.x/2;
+              geometry.y-=minSize.y;
+              break;
+            }
+            case NorthEastGravity:
+            {
+              geometry.y-=minSize.y;
+              break;
+            }
+            case WestGravity:
+            {
+              geometry.x-=minSize.x;
+              geometry.y-=minSize.y/2;
+              break;
+            }
+            case EastGravity:
+            {
+              geometry.y-=minSize.y/2;
+              break;
+            }
+            case SouthWestGravity:
+            {
+              geometry.x-=minSize.x;
+              break;
+            }
+            case SouthGravity:
+            {
+              geometry.x-=minSize.x/2;
+              break;
+            }
+            case CenterGravity:
+            {
+              geometry.x-=minSize.x/2;
+              geometry.y-=minSize.y/2;
+              break;
+            }
+            case UndefinedGravity:
+            case SouthEastGravity:
+            default:
+              break;
+          }
+          if (geometry.width < minSize.width)
+            geometry.width=minSize.width;
+          if (geometry.height < minSize.height)
+            geometry.height=minSize.height;
+          if (geometry.width > image->columns)
+            geometry.width=image->columns;
+          if (geometry.height > image->rows)
+            geometry.height=image->rows;
+          if (geometry.x < 0)
+            geometry.x=0;
+          if ((geometry.x+(ssize_t) geometry.width) > (ssize_t) image->columns)
+            geometry.x=(ssize_t) image->columns-(ssize_t) geometry.width;
+          if (geometry.y < 0)
+            geometry.y=0;
+          if ((geometry.y+(ssize_t) geometry.height) > (ssize_t) image->rows)
+            geometry.y=(ssize_t) image->rows-(ssize_t) geometry.height;
         }
-        default:
-          break;
-      }
-      geometry.width=page.width;
-      geometry.height=page.height;
     }
   geometry.x+=image->page.x;
   geometry.y+=image->page.y;
   trim_image=CropImage(image,&geometry,exception);
   if (trim_image != (Image *) NULL)
-    Update8BIMClipPath(trim_image,image->columns,image->rows,&geometry);
+    {
+      trim_image->page.width=image->columns;
+      trim_image->page.height=image->rows;
+      if (trim_image->page.x == 0)
+        trim_image->page.x=geometry.x;
+      if (trim_image->page.y == 0)
+        trim_image->page.y=geometry.y;
+    }
   return(trim_image);
 }