From 280215b9936d145dd5ee91403738ccce1333cab1 Mon Sep 17 00:00:00 2001 From: dirk Date: Sat, 16 Jan 2016 00:07:51 +0100 Subject: [PATCH] Rewrite reading pixel values. --- coders/psd.c | 167 +++++++++++++++++++++++++++------------------------ 1 file changed, 87 insertions(+), 80 deletions(-) diff --git a/coders/psd.c b/coders/psd.c index 976d9076f..6b393c2a8 100644 --- a/coders/psd.c +++ b/coders/psd.c @@ -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)); } -- 2.40.0