Commit 92172c44e for imagemagick.org
commit 92172c44e37ec906e7c155083b291b695fb824ee
Author: Dirk Lemstra <dirk@lemstra.org>
Date: Tue Apr 7 06:37:52 2026 +0200
Added option (icon:png-compression-size) to the icon decoder that can be use the specify the minimum size when png compression should be used (#2394)
diff --git a/coders/icon.c b/coders/icon.c
index 6dc27db26..ca05fd3d4 100644
--- a/coders/icon.c
+++ b/coders/icon.c
@@ -65,6 +65,7 @@
#include "MagickCore/quantum-private.h"
#include "MagickCore/static.h"
#include "MagickCore/string_.h"
+#include "MagickCore/string-private.h"
#include "MagickCore/module.h"
/*
@@ -985,6 +986,19 @@ static Image *AutoResizeImage(const Image *image,const char *option,
return(images);
}
+static inline MagickBooleanType ShouldCompressAsPng(const Image* image,
+ const size_t png_size)
+{
+ if ((png_size != 0) && (image->columns >= png_size) &&
+ (image->rows >= png_size))
+ return(MagickTrue);
+ if ((image->columns > 256L) && (image->rows > 256L) &&
+ ((image->compression == UndefinedCompression) ||
+ (image->compression == ZipCompression)))
+ return(MagickTrue);
+ return(MagickFalse);
+}
+
static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
Image *image,ExceptionInfo *exception)
{
@@ -1019,6 +1033,7 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
size_t
bytes_per_line,
number_scenes,
+ png_size,
scanline_pad;
ssize_t
@@ -1091,6 +1106,10 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
directory=AcquireIconDirectory(number_scenes);
if (directory == (IconDirectory *) NULL)
ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
+ png_size=0;
+ option=GetImageOption(image_info,"icon:png-compression-size");
+ if (option != (const char*)NULL)
+ png_size=(size_t) StringToDouble(option,(char**) NULL);
do
{
size_t
@@ -1100,9 +1119,7 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
bits_per_pixel,
planes;
- if ((frame->columns > 256L) && (frame->rows > 256L) &&
- ((frame->compression == UndefinedCompression) ||
- (frame->compression == ZipCompression)))
+ if (ShouldCompressAsPng(frame,png_size) != MagickFalse)
{
Image
*write_image;