From c9c08aafbbe1d078f53b83c2fce0a08dd307cacf Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sat, 12 Aug 2017 11:46:21 +0200 Subject: [PATCH] The mipmaps of a dds image can now be created from a list of images with -define dds:mipmaps=fromlist --- ChangeLog | 3 ++ coders/dds.c | 83 +++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 62 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index bf465c40a..2ad4c6097 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ 2017-08-11 7.0.6-7 Dirk Lemstra * Added a new option called 'dds:fast-mipmaps' (reference https://github.com/ImageMagick/ImageMagick/issues/558) + * The mipmaps of a dds image can now be created from a list of images with + -define dds:mipmaps=fromlist (reference + https://www.imagemagick.org/discourse-server/viewtopic.php?f=2&t=30236). 2017-08-10 7.0.6-6 Cristy * Release ImageMagick version 7.0.6-6, GIT revision 20775:061d0fa25:20170810. diff --git a/coders/dds.c b/coders/dds.c index d53098036..6806c5b14 100644 --- a/coders/dds.c +++ b/coders/dds.c @@ -758,7 +758,8 @@ static MagickBooleanType SkipRGBMipmaps(Image *,DDSInfo *,int,ExceptionInfo *), WriteDDSImage(const ImageInfo *,Image *,ExceptionInfo *), WriteMipmaps(Image *,const ImageInfo*,const size_t,const size_t,const size_t, - const MagickBooleanType,const MagickBooleanType,ExceptionInfo *); + const MagickBooleanType,const MagickBooleanType,const MagickBooleanType, + ExceptionInfo *); static void RemapIndices(const ssize_t *,const unsigned char *,unsigned char *), @@ -2627,6 +2628,7 @@ static MagickBooleanType WriteDDSImage(const ImageInfo *image_info, MagickBooleanType clusterFit, + fromlist, status, weightByAlpha; @@ -2676,12 +2678,31 @@ static MagickBooleanType WriteDDSImage(const ImageInfo *image_info, } } - maxMipmaps=SIZE_MAX; mipmaps=0; - if ((image->columns & (image->columns - 1)) == 0 && - (image->rows & (image->rows - 1)) == 0) + fromlist=MagickFalse; + option=GetImageOption(image_info,"dds:mipmaps"); + if (option != (char *) NULL) { - option=GetImageOption(image_info,"dds:mipmaps"); + if (LocaleNCompare(option,"fromlist",8) == 0) + { + Image + *next; + + fromlist=MagickTrue; + next=image->next; + while(next != (Image *) NULL) + { + mipmaps++; + next=next->next; + } + } + } + + if ((mipmaps == 0) && + ((image->columns & (image->columns - 1)) == 0) && + ((image->rows & (image->rows - 1)) == 0)) + { + maxMipmaps=SIZE_MAX; if (option != (char *) NULL) maxMipmaps=StringToUnsignedLong(option); @@ -2704,7 +2725,7 @@ static MagickBooleanType WriteDDSImage(const ImageInfo *image_info, exception); if ((mipmaps > 0) && (WriteMipmaps(image,image_info,pixelFormat,compression, - mipmaps,clusterFit,weightByAlpha,exception) == MagickFalse)) + mipmaps,fromlist,clusterFit,weightByAlpha,exception) == MagickFalse)) return(MagickFalse); (void) CloseBlob(image); @@ -3017,8 +3038,8 @@ static void WriteIndices(Image *image, const DDSVector3 start, static MagickBooleanType WriteMipmaps(Image *image,const ImageInfo *image_info, const size_t pixelFormat,const size_t compression,const size_t mipmaps, - const MagickBooleanType clusterFit,const MagickBooleanType weightByAlpha, - ExceptionInfo *exception) + const MagickBooleanType fromlist,const MagickBooleanType clusterFit, + const MagickBooleanType weightByAlpha,ExceptionInfo *exception) { const char *option; @@ -3044,39 +3065,53 @@ static MagickBooleanType WriteMipmaps(Image *image,const ImageInfo *image_info, option=GetImageOption(image_info,"dds:fast-mipmaps"); fast_mipmaps=IsStringTrue(option); mipmap_image=image; + resize_image=image; status=MagickTrue; - for (i=0; i< (ssize_t) mipmaps; i++) + for (i=0; i < (ssize_t) mipmaps; i++) { - resize_image=ResizeImage(mipmap_image,columns,rows,TriangleFilter, - exception); + if (fromlist == MagickFalse) + { + mipmap_image=ResizeImage(resize_image,columns,rows,TriangleFilter, + exception); - if (resize_image == (Image *) NULL) + if (mipmap_image == (Image *) NULL) + { + status=MagickFalse; + break; + } + } + else { - status=MagickFalse; - break; + mipmap_image=mipmap_image->next; + if ((mipmap_image->columns != columns) || (mipmap_image->rows != rows)) + ThrowBinaryException(CoderError,"ImageColumnOrRowSizeIsNotSupported", + image->filename); } - DestroyBlob(resize_image); - resize_image->blob=ReferenceBlob(image->blob); + DestroyBlob(mipmap_image); + mipmap_image->blob=ReferenceBlob(image->blob); - WriteImageData(resize_image,pixelFormat,compression,weightByAlpha, + WriteImageData(mipmap_image,pixelFormat,compression,weightByAlpha, clusterFit,exception); - if (fast_mipmaps == MagickFalse) - resize_image=DestroyImage(resize_image); - else + if (fromlist == MagickFalse) { - if (mipmap_image != image) + if (fast_mipmaps == MagickFalse) mipmap_image=DestroyImage(mipmap_image); - mipmap_image=resize_image; + else + { + if (resize_image != image) + resize_image=DestroyImage(resize_image); + resize_image=mipmap_image; + } } columns=DIV2(columns); rows=DIV2(rows); } - if (mipmap_image != image) - mipmap_image=DestroyImage(mipmap_image); + if (resize_image != image) + resize_image=DestroyImage(resize_image); return(status); } -- 2.40.0