]> granicus.if.org Git - imagemagick/blobdiff - coders/gradient.c
(no commit message)
[imagemagick] / coders / gradient.c
index b0d33368dc69421aadaa09688eaf6ecc9df48637..03c927b41011fb79d197c587cb7fe4c41aaae013 100644 (file)
@@ -17,7 +17,7 @@
 %                                 July 1992                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2012 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  %
@@ -44,6 +44,7 @@
 #include "MagickCore/blob-private.h"
 #include "MagickCore/color.h"
 #include "MagickCore/color-private.h"
+#include "MagickCore/colorspace-private.h"
 #include "MagickCore/draw.h"
 #include "MagickCore/exception.h"
 #include "MagickCore/exception-private.h"
@@ -117,7 +118,7 @@ static Image *ReadGRADIENTImage(const ImageInfo *image_info,
   image=AcquireImage(image_info,exception);
   if ((image->columns == 0) || (image->rows == 0))
     ThrowReaderException(OptionError,"MustSpecifyImageSize");
-  (void) SetImageAlpha(image,(Quantum) TransparentAlpha);
+  (void) SetImageAlpha(image,(Quantum) TransparentAlpha,exception);
   (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent);
   (void) CopyMagickString(colorname,image_info->filename,MaxTextExtent);
   (void) sscanf(image_info->filename,"%[^-]",colorname);
@@ -137,9 +138,40 @@ static Image *ReadGRADIENTImage(const ImageInfo *image_info,
       image=DestroyImage(image);
       return((Image *) NULL);
     }
-  (void) GradientImage(image,LocaleCompare(image_info->magick,"GRADIENT") == 0 ?
+  if (IssRGBColorspace(start_color.colorspace) != MagickFalse)
+    {
+      start_color.red=QuantumRange*DecompandsRGB(QuantumScale*
+        start_color.red);
+      start_color.green=QuantumRange*DecompandsRGB(QuantumScale*
+        start_color.green);
+      start_color.blue=QuantumRange*DecompandsRGB(QuantumScale*
+        start_color.blue);
+    }
+  if (IssRGBColorspace(stop_color.colorspace) != MagickFalse)
+    {
+      stop_color.red=QuantumRange*DecompandsRGB(QuantumScale*
+        stop_color.red);
+      stop_color.green=QuantumRange*DecompandsRGB(QuantumScale*
+        stop_color.green);
+      stop_color.blue=QuantumRange*DecompandsRGB(QuantumScale*
+        stop_color.blue);
+    }
+  status=GradientImage(image,LocaleCompare(image_info->magick,"GRADIENT") == 0 ?
     LinearGradient : RadialGradient,PadSpread,&start_color,&stop_color,
     exception);
+  if (status == MagickFalse)
+    {
+      image=DestroyImageList(image);
+      return((Image *) NULL);
+    }
+  (void) SetImageColorspace(image,start_color.colorspace,exception);
+  if ((start_color.matte == MagickFalse) && (stop_color.matte == MagickFalse))
+    (void) SetImageAlphaChannel(image,DeactivateAlphaChannel,exception);
+  if (IssRGBColorspace(start_color.colorspace) != MagickFalse)
+    {
+      (void) SetImageColorspace(image,RGBColorspace,exception);
+      (void) TransformImageColorspace(image,sRGBColorspace,exception);
+    }
   return(GetFirstImageInList(image));
 }
 \f