]> granicus.if.org Git - imagemagick/blobdiff - coders/dds.c
(no commit message)
[imagemagick] / coders / dds.c
index 0421b75732cb7c2d0d2297870b0db8917d2ee454..0e358d96726a34e1fab9621717ee6513f4495721 100644 (file)
@@ -17,7 +17,7 @@
 %                                March 2008                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -153,7 +153,7 @@ typedef struct _DDSColors
 } DDSColors;
 
 typedef MagickBooleanType
-  DDSDecoder(Image *,DDSInfo *);
+  DDSDecoder(Image *,DDSInfo *,ExceptionInfo *);
 
 /*
   Macros
@@ -179,19 +179,19 @@ static void
     DDSColors *c, MagickBooleanType ignoreAlpha);
 
 static MagickBooleanType
-  ReadDXT1(Image *image, DDSInfo *dds_info);
+  ReadDXT1(Image *, DDSInfo *,ExceptionInfo *);
 
 static MagickBooleanType
-  ReadDXT3(Image *image, DDSInfo *dds_info);
+  ReadDXT3(Image *image, DDSInfo *dds_info,ExceptionInfo *);
 
 static MagickBooleanType
-  ReadDXT5(Image *image, DDSInfo *dds_info);
+  ReadDXT5(Image *image, DDSInfo *dds_info,ExceptionInfo *);
 
 static MagickBooleanType
-  ReadUncompressedRGB(Image *image, DDSInfo *dds_info);
+  ReadUncompressedRGB(Image *image, DDSInfo *dds_info,ExceptionInfo *);
 
 static MagickBooleanType
-  ReadUncompressedRGBA(Image *image, DDSInfo *dds_info);
+  ReadUncompressedRGBA(Image *image, DDSInfo *dds_info,ExceptionInfo *);
 
 static void
   SkipDXTMipmaps(Image *image, DDSInfo *dds_info, int texel_size);
@@ -241,9 +241,8 @@ static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception)
   MagickBooleanType
     status,
     cubemap = MagickFalse,
-    volume = MagickFalse,
-    matte;
-  
+    volume = MagickFalse;
+
   CompressionType
     compression;
 
@@ -253,6 +252,9 @@ static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception)
   DDSDecoder
     *decoder;
   
+  PixelTrait
+    alpha_trait;
+  
   size_t
     n, num_images;
   
@@ -266,7 +268,7 @@ static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception)
       image_info->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
-  image=AcquireImage(image_info);
+  image=AcquireImage(image_info,exception);
   status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
   if (status == MagickFalse)
     {
@@ -297,12 +299,12 @@ static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception)
       compression = NoCompression;
       if (dds_info.pixelformat.flags & DDPF_ALPHAPIXELS)
         {
-          matte = MagickTrue;
+          alpha_trait = BlendPixelTrait;
           decoder = ReadUncompressedRGBA;
         }
       else
         {
-          matte = MagickTrue;
+          alpha_trait = UndefinedPixelTrait;
           decoder = ReadUncompressedRGB;
         }
     }
@@ -312,7 +314,7 @@ static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception)
       {
         case FOURCC_DXT1:
         {
-          matte = MagickFalse;
+          alpha_trait = UndefinedPixelTrait;
           compression = DXT1Compression;
           decoder = ReadDXT1;
           break;
@@ -320,7 +322,7 @@ static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception)
         
         case FOURCC_DXT3:
         {
-          matte = MagickTrue;
+          alpha_trait = BlendPixelTrait;
           compression = DXT3Compression;
           decoder = ReadDXT3;
           break;
@@ -328,7 +330,7 @@ static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception)
         
         case FOURCC_DXT5:
         {
-          matte = MagickTrue;
+          alpha_trait = BlendPixelTrait;
           compression = DXT5Compression;
           decoder = ReadDXT5;
           break;
@@ -370,7 +372,7 @@ static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception)
     if (n != 0)
       {
         /* Start a new image */
-        AcquireNextImage(image_info,image);
+        AcquireNextImage(image_info,image,exception);
         if (GetNextImageInList(image) == (Image *) NULL)
           {
             image = DestroyImageList(image);
@@ -379,7 +381,7 @@ static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception)
         image=SyncNextImageInList(image);
       }
     
-    image->matte = matte;
+    image->alpha_trait=alpha_trait;
     image->compression = compression;
     image->columns = dds_info.width;
     image->rows = dds_info.height;
@@ -392,7 +394,7 @@ static Image *ReadDDSImage(const ImageInfo *image_info,ExceptionInfo *exception)
         return(GetFirstImageInList(image));
       }
     
-    if ((decoder)(image, &dds_info) != MagickTrue)
+    if ((decoder)(image, &dds_info, exception) != MagickTrue)
       {
         (void) CloseBlob(image);
         return(GetFirstImageInList(image));
@@ -491,14 +493,12 @@ static void CalculateColors(unsigned short c0, unsigned short c1,
     }
 }
 
-static MagickBooleanType ReadDXT1(Image *image, DDSInfo *dds_info)
+static MagickBooleanType ReadDXT1(Image *image, DDSInfo *dds_info,
+  ExceptionInfo *exception)
 {
   DDSColors
     colors;
 
-  ExceptionInfo
-    *exception;
-
   register Quantum
     *q;
   
@@ -520,7 +520,6 @@ static MagickBooleanType ReadDXT1(Image *image, DDSInfo *dds_info)
     c0,
     c1;
   
-  exception=(&image->exception);
   for (y = 0; y < (ssize_t) dds_info->height; y += 4)
   {
     for (x = 0; x < (ssize_t) dds_info->width; x += 4)
@@ -552,8 +551,8 @@ static MagickBooleanType ReadDXT1(Image *image, DDSInfo *dds_info)
               SetPixelGreen(image,ScaleCharToQuantum(colors.g[code]),q);
               SetPixelBlue(image,ScaleCharToQuantum(colors.b[code]),q);
               SetPixelAlpha(image,ScaleCharToQuantum(colors.a[code]),q);
-              if (colors.a[code] && (image->matte == MagickFalse))
-                image->matte=MagickTrue;  /* Correct matte */
+              if (colors.a[code] && (image->alpha_trait != BlendPixelTrait))
+                image->alpha_trait=BlendPixelTrait;  /* Correct matte */
               q+=GetPixelChannels(image);
             }
         }
@@ -569,14 +568,12 @@ static MagickBooleanType ReadDXT1(Image *image, DDSInfo *dds_info)
   return MagickTrue;
 }
 
-static MagickBooleanType ReadDXT3(Image *image, DDSInfo *dds_info)
+static MagickBooleanType ReadDXT3(Image *image, DDSInfo *dds_info,
+  ExceptionInfo *exception)
 {
   DDSColors
     colors;
   
-  ExceptionInfo
-    *exception;
-
   register Quantum
     *q;
   
@@ -601,7 +598,6 @@ static MagickBooleanType ReadDXT3(Image *image, DDSInfo *dds_info)
     c0,
     c1;
   
-  exception=(&image->exception);
   for (y = 0; y < (ssize_t) dds_info->height; y += 4)
   {
     for (x = 0; x < (ssize_t) dds_info->width; x += 4)
@@ -658,14 +654,12 @@ static MagickBooleanType ReadDXT3(Image *image, DDSInfo *dds_info)
   return MagickTrue;
 }
 
-static MagickBooleanType ReadDXT5(Image *image, DDSInfo *dds_info)
+static MagickBooleanType ReadDXT5(Image *image, DDSInfo *dds_info,
+  ExceptionInfo *exception)
 {
   DDSColors
     colors;
   
-  ExceptionInfo
-    *exception;
-
   MagickSizeType
     alpha_bits;
   
@@ -694,7 +688,6 @@ static MagickBooleanType ReadDXT5(Image *image, DDSInfo *dds_info)
     c0,
     c1;
   
-  exception=(&image->exception);
   for (y = 0; y < (ssize_t) dds_info->height; y += 4)
   {
     for (x = 0; x < (ssize_t) dds_info->width; x += 4)
@@ -762,18 +755,15 @@ static MagickBooleanType ReadDXT5(Image *image, DDSInfo *dds_info)
   return MagickTrue;
 }
 
-static MagickBooleanType ReadUncompressedRGB(Image *image, DDSInfo *dds_info)
+static MagickBooleanType ReadUncompressedRGB(Image *image, DDSInfo *dds_info,
+  ExceptionInfo *exception)
 {
-  ExceptionInfo
-    *exception;
-
   ssize_t
     x, y;
   
   register Quantum
     *q;
   
-  exception=(&image->exception);
   for (y = 0; y < (ssize_t) dds_info->height; y++)
   {
     q = QueueAuthenticPixels(image, 0, y, dds_info->width, 1,exception);
@@ -803,18 +793,15 @@ static MagickBooleanType ReadUncompressedRGB(Image *image, DDSInfo *dds_info)
   return MagickTrue;
 }
 
-static MagickBooleanType ReadUncompressedRGBA(Image *image, DDSInfo *dds_info)
+static MagickBooleanType ReadUncompressedRGBA(Image *image, DDSInfo *dds_info,
+  ExceptionInfo *exception)
 {
-  ExceptionInfo
-    *exception;
-
   ssize_t
     x, y;
   
   register Quantum
     *q;
   
-  exception=(&image->exception);
   for (y = 0; y < (ssize_t) dds_info->height; y++)
   {
     q = QueueAuthenticPixels(image, 0, y, dds_info->width, 1,exception);