]> granicus.if.org Git - imagemagick/commitdiff
Rewrite reading pixel values.
authordirk <dirk@git.imagemagick.org>
Fri, 15 Jan 2016 23:07:51 +0000 (00:07 +0100)
committerdirk <dirk@git.imagemagick.org>
Fri, 15 Jan 2016 23:08:11 +0000 (00:08 +0100)
coders/psd.c

index 976d9076fbcce75b51e881d3c4a0f773a32ee92c..6b393c2a846c19e9291493d0b2f2c77b1a6f4f9d 100644 (file)
@@ -764,6 +764,72 @@ static inline void ReversePSDString(Image *image,char *p,size_t length)
   }
 }
 
+static inline void SetPSDPixel(Image *image,const size_t channels,
+  const ssize_t type,const size_t packet_size,const Quantum pixel,Quantum *q,
+  ExceptionInfo *exception)
+{
+  if (image->storage_class == PseudoClass)
+    {
+      if (packet_size == 1)
+        SetPixelIndex(image,ScaleQuantumToChar(pixel),q);
+      else
+        SetPixelIndex(image,ScaleQuantumToShort(pixel),q);
+      SetPixelViaPixelInfo(image,image->colormap+(ssize_t)
+        ConstrainColormapIndex(image,GetPixelIndex(image,q),exception),q);
+      return;
+    }
+  switch (type)
+  {
+    case -1:
+    {
+      SetPixelAlpha(image, pixel,q);
+      break;
+    }
+    case -2:
+    case 0:
+    {
+      SetPixelRed(image,pixel,q);
+      if (channels == 1 || type == -2)
+        SetPixelGray(image,pixel,q);
+      break;
+    }
+    case 1:
+    {
+      if (image->storage_class == PseudoClass)
+        SetPixelAlpha(image,pixel,q);
+      else
+        SetPixelGreen(image,pixel,q);
+      break;
+    }
+    case 2:
+    {
+      if (image->storage_class == PseudoClass)
+        SetPixelAlpha(image,pixel,q);
+      else
+        SetPixelBlue(image,pixel,q);
+      break;
+    }
+    case 3:
+    {
+      if (image->colorspace == CMYKColorspace)
+        SetPixelBlack(image,pixel,q);
+      else
+        if (image->alpha_trait != UndefinedPixelTrait)
+          SetPixelAlpha(image,pixel,q);
+      break;
+    }
+    case 4:
+    {
+      if ((IssRGBCompatibleColorspace(image->colorspace) != MagickFalse) &&
+          (channels > 3))
+        break;
+      if (image->alpha_trait != UndefinedPixelTrait)
+        SetPixelAlpha(image,pixel,q);
+      break;
+    }
+  }
+}
+
 static MagickBooleanType ReadPSDChannelPixels(Image *image,
   const size_t channels,const size_t row,const ssize_t type,
   const unsigned char *pixels,ExceptionInfo *exception)
@@ -800,90 +866,31 @@ static MagickBooleanType ReadPSDChannelPixels(Image *image,
         p=PushShortPixel(MSBEndian,p,&nibble);
         pixel=ScaleShortToQuantum(nibble);
       }
-    switch (type)
-    {
-      case -1:
+    if (image->depth > 1)
       {
-        SetPixelAlpha(image,pixel,q);
-        break;
+        SetPSDPixel(image,channels,type,packet_size,pixel,q,exception);
+        q+=GetPixelChannels(image);
       }
-      case -2:
-      case 0:
-      {
-        SetPixelRed(image,pixel,q);
-        if (channels == 1 || type == -2)
-          SetPixelGray(image,pixel,q);
-        if (image->storage_class == PseudoClass)
-          {
-            if (packet_size == 1)
-              SetPixelIndex(image,ScaleQuantumToChar(pixel),q);
-            else
-              SetPixelIndex(image,ScaleQuantumToShort(pixel),q);
-            SetPixelViaPixelInfo(image,image->colormap+(ssize_t)
-              ConstrainColormapIndex(image,GetPixelIndex(image,q),exception),q);
-            if (image->depth == 1)
-              {
-                ssize_t
-                  bit,
-                  number_bits;
-  
-                number_bits=image->columns-x;
-                if (number_bits > 8)
-                  number_bits=8;
-                for (bit=0; bit < number_bits; bit++)
-                {
-                  SetPixelIndex(image,(((unsigned char) pixel) &
-                    (0x01 << (7-bit))) != 0 ? 0 : 255,q);
-                  SetPixelViaPixelInfo(image,image->colormap+(ssize_t)
-                    ConstrainColormapIndex(image,GetPixelIndex(image,q),
-                      exception),q);
-                  q+=GetPixelChannels(image);
-                  x++;
-                }
-                x--;
-                continue;
-              }
-          }
-        break;
-      }
-      case 1:
-      {
-        if (image->storage_class == PseudoClass)
-          SetPixelAlpha(image,pixel,q);
-        else
-          SetPixelGreen(image,pixel,q);
-        break;
-      }
-      case 2:
-      {
-        if (image->storage_class == PseudoClass)
-          SetPixelAlpha(image,pixel,q);
-        else
-          SetPixelBlue(image,pixel,q);
-        break;
-      }
-      case 3:
-      {
-        if (image->colorspace == CMYKColorspace)
-          SetPixelBlack(image,pixel,q);
-        else
-          if (image->alpha_trait != UndefinedPixelTrait)
-            SetPixelAlpha(image,pixel,q);
-        break;
-      }
-      case 4:
+    else
       {
-        if ((IssRGBCompatibleColorspace(image->colorspace) != MagickFalse) &&
-            (channels > 3))
-          break;
-        if (image->alpha_trait != UndefinedPixelTrait)
-          SetPixelAlpha(image,pixel,q);
-        break;
+        ssize_t
+          bit,
+          number_bits;
+      
+        number_bits=image->columns-x;
+        if (number_bits > 8)
+          number_bits=8;
+        for (bit = 0; bit < number_bits; bit++)
+        {
+          SetPSDPixel(image,channels,type,packet_size,(((unsigned char) pixel)
+            & (0x01 << (7-bit))) != 0 ? 0 : 255,q,exception);
+          q+=GetPixelChannels(image);
+          x++;
+        }
+        if (x != image->columns)
+          x--;
+        continue;
       }
-      default:
-        break;
-    }
-    q+=GetPixelChannels(image);
   }
   return(SyncAuthenticPixels(image,exception));
 }