]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Thu, 1 Apr 2010 18:55:09 +0000 (18:55 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Thu, 1 Apr 2010 18:55:09 +0000 (18:55 +0000)
coders/psd.c
magick/attribute.c

index f9183e61b185562707cf7bf1acc642142a21e2ac..cc2f1cbb36b49cce924a83db2b30495b2fb97823 100644 (file)
@@ -1596,8 +1596,6 @@ static void WritePackbitsLength(const PSDInfo *psd_info,
 
   if (tmp_image->depth > 8)
     tmp_image->depth=16;
-  else
-    tmp_image->depth=8;
   packet_size=tmp_image->depth > 8UL ? 2UL : 1UL;
   quantum_info=AcquireQuantumInfo(image_info,image);
   for (y=0; y < (long) tmp_image->rows; y++)
@@ -1621,12 +1619,18 @@ static void WriteOneChannel(const PSDInfo *psd_info,const ImageInfo *image_info,
   int
     y;
 
+  MagickBooleanType
+    monochrome;
+
   QuantumInfo
     *quantum_info;
 
   register const PixelPacket
     *p;
 
+  register long
+    i;
+
   size_t
     length,
     packet_size;
@@ -1637,8 +1641,7 @@ static void WriteOneChannel(const PSDInfo *psd_info,const ImageInfo *image_info,
     (void) WriteBlobMSBShort(image,0);
   if (tmp_image->depth > 8)
     tmp_image->depth=16;
-  else
-    tmp_image->depth=8;
+  monochrome=IsMonochromeImage(image,&image->exception);
   packet_size=tmp_image->depth > 8UL ? 2UL : 1UL;
   quantum_info=AcquireQuantumInfo(image_info,image);
   for (y=0; y < (long) tmp_image->rows; y++)
@@ -1648,6 +1651,9 @@ static void WriteOneChannel(const PSDInfo *psd_info,const ImageInfo *image_info,
       break;
     length=ExportQuantumPixels(tmp_image,(CacheView *) NULL,quantum_info,
       quantum_type,pixels,&image->exception);
+    if (monochrome != MagickFalse)
+      for (i=0; i < length; i++)
+        pixels[i]=(~pixels[i]);
     if (tmp_image->compression != RLECompression)
       (void) WriteBlob(image,length,pixels);
     else
@@ -1697,35 +1703,8 @@ static MagickBooleanType WriteImageChannels(const PSDInfo *psd_info,
       ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
     }
   i=0;
-  if (tmp_image->storage_class == PseudoClass)
+  if (IsMonochromeImage(tmp_image,&tmp_image->exception) != MagickFalse)
     {
-      if (tmp_image->compression == RLECompression)
-        {
-          /*
-            Packbits compression.
-          */
-          (void) WriteBlobMSBShort(image,1);
-          if (tmp_image->matte == MagickFalse)
-            WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
-              compact_pixels,IndexQuantum);
-          else
-            WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
-              compact_pixels,IndexAlphaQuantum);
-        }
-      if (tmp_image->matte == MagickFalse)
-        WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
-          compact_pixels,IndexQuantum,(i++ == 0) ||
-          (separate != MagickFalse) ? MagickTrue : MagickFalse);
-      else
-        WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
-          compact_pixels,IndexAlphaQuantum,(i++ == 0) ||
-          (separate != MagickFalse) ?  MagickTrue : MagickFalse);
-      (void) SetImageProgress(image,SaveImagesTag,0,1);
-    }
-  else
-    {
-      if (tmp_image->colorspace == CMYKColorspace)
-        (void) NegateImage(image,MagickFalse);
       if (tmp_image->compression == RLECompression)
         {
           /*
@@ -1736,42 +1715,88 @@ static MagickBooleanType WriteImageChannels(const PSDInfo *psd_info,
             WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
               compact_pixels,AlphaQuantum);
           WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
-            compact_pixels,RedQuantum);
-          WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
-            compact_pixels,GreenQuantum);
-          WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
-            compact_pixels,BlueQuantum);
-          if (tmp_image->colorspace == CMYKColorspace)
-            WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
-              compact_pixels,BlackQuantum);
+           compact_pixels,GrayQuantum);
         }
-      (void) SetImageProgress(image,SaveImagesTag,0,6);
-      if (tmp_image->matte != MagickFalse)
-        WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
-          compact_pixels,AlphaQuantum,(i++ == 0) ||
-          (separate != MagickFalse) ? MagickTrue : MagickFalse);
-      (void) SetImageProgress(image,SaveImagesTag,1,6);
       WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
-        compact_pixels,RedQuantum,(i++ == 0) || (separate != MagickFalse) ?
+        compact_pixels,GrayQuantum,(i++ == 0) || (separate != MagickFalse) ?
         MagickTrue : MagickFalse);
-      (void) SetImageProgress(image,SaveImagesTag,2,6);
-      WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
-        compact_pixels,GreenQuantum,(i++ == 0) || (separate != MagickFalse) ?
-        MagickTrue : MagickFalse);
-      (void) SetImageProgress(image,SaveImagesTag,3,6);
-      WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
-        compact_pixels,BlueQuantum,(i++ == 0) || (separate != MagickFalse) ?
-        MagickTrue : MagickFalse);
-      (void) SetImageProgress(image,SaveImagesTag,4,6);
-      if (tmp_image->colorspace == CMYKColorspace)
-        {
+    }
+  else
+    if (tmp_image->storage_class == PseudoClass)
+      {
+        if (tmp_image->compression == RLECompression)
+          {
+            /*
+              Packbits compression.
+            */
+            (void) WriteBlobMSBShort(image,1);
+            if (tmp_image->matte == MagickFalse)
+              WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+                compact_pixels,IndexQuantum);
+            else
+              WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+                compact_pixels,IndexAlphaQuantum);
+          }
+        if (tmp_image->matte == MagickFalse)
           WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
-            compact_pixels,BlackQuantum,(i++ == 0) ||
+            compact_pixels,IndexQuantum,(i++ == 0) ||
             (separate != MagickFalse) ? MagickTrue : MagickFalse);
+        else
+          WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+            compact_pixels,IndexAlphaQuantum,(i++ == 0) ||
+            (separate != MagickFalse) ?  MagickTrue : MagickFalse);
+        (void) SetImageProgress(image,SaveImagesTag,0,1);
+      }
+    else
+      {
+        if (tmp_image->colorspace == CMYKColorspace)
           (void) NegateImage(image,MagickFalse);
-        }
-      (void) SetImageProgress(image,SaveImagesTag,5,6);
-    }
+        if (tmp_image->compression == RLECompression)
+          {
+            /*
+              Packbits compression.
+            */
+            (void) WriteBlobMSBShort(image,1);
+            if (tmp_image->matte != MagickFalse)
+              WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+                compact_pixels,AlphaQuantum);
+            WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+              compact_pixels,RedQuantum);
+            WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+              compact_pixels,GreenQuantum);
+            WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+              compact_pixels,BlueQuantum);
+            if (tmp_image->colorspace == CMYKColorspace)
+              WritePackbitsLength(psd_info,image_info,image,tmp_image,pixels,
+                compact_pixels,BlackQuantum);
+          }
+        (void) SetImageProgress(image,SaveImagesTag,0,6);
+        if (tmp_image->matte != MagickFalse)
+          WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+            compact_pixels,AlphaQuantum,(i++ == 0) ||
+            (separate != MagickFalse) ? MagickTrue : MagickFalse);
+        (void) SetImageProgress(image,SaveImagesTag,1,6);
+        WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+          compact_pixels,RedQuantum,(i++ == 0) || (separate != MagickFalse) ?
+          MagickTrue : MagickFalse);
+        (void) SetImageProgress(image,SaveImagesTag,2,6);
+        WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+          compact_pixels,GreenQuantum,(i++ == 0) || (separate != MagickFalse) ?
+          MagickTrue : MagickFalse);
+        (void) SetImageProgress(image,SaveImagesTag,3,6);
+        WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+          compact_pixels,BlueQuantum,(i++ == 0) || (separate != MagickFalse) ?
+          MagickTrue : MagickFalse);
+        (void) SetImageProgress(image,SaveImagesTag,4,6);
+        if (tmp_image->colorspace == CMYKColorspace)
+          {
+            WriteOneChannel(psd_info,image_info,image,tmp_image,pixels,
+              compact_pixels,BlackQuantum,(i++ == 0) ||
+              (separate != MagickFalse) ? MagickTrue : MagickFalse);
+            (void) NegateImage(image,MagickFalse);
+          }
+        (void) SetImageProgress(image,SaveImagesTag,5,6);
+      }
   pixels=(unsigned char *) RelinquishMagickMemory(pixels);
   return(MagickTrue);
 }
@@ -1892,34 +1917,48 @@ static MagickBooleanType WritePSDImage(const ImageInfo *image_info,Image *image)
   (void) WriteBlobMSBShort(image,psd_info.version);  /* version */
   for (i=1; i <= 6; i++)
     (void) WriteBlobByte(image, 0);  /* 6 bytes of reserved */
-  if (image->storage_class == PseudoClass)
-    num_channels=(image->matte ? 2UL : 1UL);
+  if (IsMonochromeImage(image,&image->exception) != MagickFalse)
+    num_channels=1;
   else
-    {
-      if (image->colorspace != CMYKColorspace)
-        num_channels=(image->matte ? 4UL : 3UL);
-      else
-        num_channels=(image->matte ? 5UL : 4UL);
-    }
+    if (image->storage_class == PseudoClass)
+      num_channels=(image->matte ? 2UL : 1UL);
+    else
+      {
+        if (image->colorspace != CMYKColorspace)
+          num_channels=(image->matte ? 4UL : 3UL);
+        else
+          num_channels=(image->matte ? 5UL : 4UL);
+      }
   (void) WriteBlobMSBShort(image,(unsigned short) num_channels);
   (void) WriteBlobMSBLong(image,(unsigned int) image->rows);
   (void) WriteBlobMSBLong(image,(unsigned int) image->columns);
-  (void) WriteBlobMSBShort(image,(unsigned short)
-    (image->storage_class == PseudoClass ? 8 : image->depth > 8 ? 16 : 8));
-  if (((image->colorspace != UndefinedColorspace) ||
-       (image->colorspace != CMYKColorspace)) &&
-       (image->colorspace != CMYKColorspace))
+  if (IsMonochromeImage(image,&image->exception) != MagickFalse)
     {
-      if (image->colorspace != RGBColorspace)
-        (void) TransformImageColorspace(image,RGBColorspace);
-      (void) WriteBlobMSBShort(image,(unsigned short)
-        (image->storage_class == PseudoClass ? 2 : 3));
+      /*
+        Write depth & mode.
+      */
+      (void) WriteBlobMSBShort(image,1);
+      (void) WriteBlobMSBShort(image,0);
     }
   else
     {
-      if (image->colorspace != RGBColorspace)
-        (void) TransformImageColorspace(image,CMYKColorspace);
-      (void) WriteBlobMSBShort(image,4);
+      (void) WriteBlobMSBShort(image,(unsigned short)
+        (image->storage_class == PseudoClass ? 8 : image->depth > 8 ? 16 : 8));
+      if (((image->colorspace != UndefinedColorspace) ||
+           (image->colorspace != CMYKColorspace)) &&
+           (image->colorspace != CMYKColorspace))
+        {
+          if (image->colorspace != RGBColorspace)
+            (void) TransformImageColorspace(image,RGBColorspace);
+          (void) WriteBlobMSBShort(image,(unsigned short)
+            (image->storage_class == PseudoClass ? 2 : 3));
+        }
+      else
+        {
+          if (image->colorspace != RGBColorspace)
+            (void) TransformImageColorspace(image,CMYKColorspace);
+          (void) WriteBlobMSBShort(image,4);
+        }
     }
   if ((image->storage_class == DirectClass) || (image->colors > 256))
     (void) WriteBlobMSBLong(image,0);
index d2dd375de1b5be3421c656d3c5ed286404fd4162..6349d9842322b92bd5ddfc6425575f2c4ee7524a 100644 (file)
@@ -584,12 +584,21 @@ MagickExport ImageType GetImageType(const Image *image,ExceptionInfo *exception)
 MagickExport MagickBooleanType IsGrayImage(const Image *image,
   ExceptionInfo *exception)
 {
+  CacheView
+    *image_view;
+
   ImageType
     type;
 
+  long
+    y;
+
   register const PixelPacket
     *p;
 
+  register long
+    x;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
@@ -600,63 +609,27 @@ MagickExport MagickBooleanType IsGrayImage(const Image *image,
   if (image->colorspace == CMYKColorspace)
     return(MagickFalse);
   type=BilevelType;
-  switch (image->storage_class)
+  image_view=AcquireCacheView(image);
+  for (y=0; y < (long) image->rows; y++)
   {
-    case DirectClass:
-    case UndefinedClass:
+    p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
+    if (p == (const PixelPacket *) NULL)
+      break;
+    for (x=0; x < (long) image->columns; x++)
     {
-      long
-        y;
-
-      register long
-        x;
-
-      CacheView
-        *image_view;
-
-      image_view=AcquireCacheView(image);
-      for (y=0; y < (long) image->rows; y++)
-      {
-        p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
-        if (p == (const PixelPacket *) NULL)
-          break;
-        for (x=0; x < (long) image->columns; x++)
+      if (IsGrayPixel(p) == MagickFalse)
         {
-          if (IsGrayPixel(p) == MagickFalse)
-            {
-              type=UndefinedType;
-              break;
-            }
-          if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
-            type=GrayscaleType;
-          p++;
-        }
-        if (type == UndefinedType)
+          type=UndefinedType;
           break;
-      }
-      image_view=DestroyCacheView(image_view);
-      break;
+        }
+      if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
+        type=GrayscaleType;
+      p++;
     }
-    case PseudoClass:
-    {
-      register long
-        i;
-
-      p=image->colormap;
-      for (i=0; i < (long) image->colors; i++)
-      {
-        if (IsGrayPixel(p) == MagickFalse)
-          {
-            type=UndefinedType;
-            break;
-          }
-        if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
-          type=GrayscaleType;
-        p++;
-      }
+    if (type == UndefinedType)
       break;
-    }
   }
+  image_view=DestroyCacheView(image_view);
   if (type == UndefinedType)
     return(MagickFalse);
   ((Image *) image)->type=type;
@@ -695,9 +668,18 @@ MagickExport MagickBooleanType IsGrayImage(const Image *image,
 MagickExport MagickBooleanType IsMonochromeImage(const Image *image,
   ExceptionInfo *exception)
 {
+  CacheView
+    *image_view;
+
   ImageType
     type;
 
+  long
+    y;
+
+  register long
+    x;
+
   register const PixelPacket
     *p;
 
@@ -710,59 +692,25 @@ MagickExport MagickBooleanType IsMonochromeImage(const Image *image,
   if (image->colorspace == CMYKColorspace)
     return(MagickFalse);
   type=BilevelType;
-  switch (image->storage_class)
+  image_view=AcquireCacheView(image);
+  for (y=0; y < (long) image->rows; y++)
   {
-    case DirectClass:
-    case UndefinedClass:
+    p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
+    if (p == (const PixelPacket *) NULL)
+      break;
+    for (x=0; x < (long) image->columns; x++)
     {
-      long
-        y;
-
-      register long
-        x;
-
-      CacheView
-        *image_view;
-
-      image_view=AcquireCacheView(image);
-      for (y=0; y < (long) image->rows; y++)
-      {
-        p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
-        if (p == (const PixelPacket *) NULL)
-          break;
-        for (x=0; x < (long) image->columns; x++)
+      if (IsMonochromePixel(p) == MagickFalse)
         {
-          if (IsMonochromePixel(p) == MagickFalse)
-            {
-              type=UndefinedType;
-              break;
-            }
-          p++;
-        }
-        if (type == UndefinedType)
+          type=UndefinedType;
           break;
-      }
-      image_view=DestroyCacheView(image_view);
-      break;
+        }
+      p++;
     }
-    case PseudoClass:
-    {
-      register long
-        i;
-
-      p=image->colormap;
-      for (i=0; i < (long) image->colors; i++)
-      {
-        if (IsMonochromePixel(p) == MagickFalse)
-          {
-            type=UndefinedType;
-            break;
-          }
-        p++;
-      }
+    if (type == UndefinedType)
       break;
-    }
   }
+  image_view=DestroyCacheView(image_view);
   if (type == UndefinedType)
     return(MagickFalse);
   ((Image *) image)->type=type;