]> granicus.if.org Git - imagemagick/commitdiff
The mipmaps of a dds image can now be created from a list of images with -define...
authorDirk Lemstra <dirk@git.imagemagick.org>
Sat, 12 Aug 2017 09:46:21 +0000 (11:46 +0200)
committerDirk Lemstra <dirk@git.imagemagick.org>
Sat, 12 Aug 2017 09:46:21 +0000 (11:46 +0200)
ChangeLog
coders/dds.c

index bf465c40ab3f77fb5709e0ec06f084e4ea3e054a..2ad4c60977fc8319e2dc64012c134eef16d7cc9f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,9 @@
 2017-08-11  7.0.6-7 Dirk Lemstra <dirk@lem.....org>
   * 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  <quetzlzacatenango@image...>
   * Release ImageMagick version 7.0.6-6, GIT revision 20775:061d0fa25:20170810.
index d53098036279b4ebc760cd2a28cdee91c30c273a..6806c5b1400fd11765cae91449e0a7b53feb0119 100644 (file)
@@ -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);
 }