From 3b8b0b8b150e3f9bc338bb2c01af291269987f81 Mon Sep 17 00:00:00 2001 From: dirk <dirk@git.imagemagick.org> Date: Sun, 8 Mar 2015 10:37:18 +0000 Subject: [PATCH] Added separate import and export methods for opacity. --- MagickCore/quantum-export.c | 725 +++++++++++++++++++++++++++++++++--- MagickCore/quantum-import.c | 714 +++++++++++++++++++++++++++++++++-- 2 files changed, 1360 insertions(+), 79 deletions(-) diff --git a/MagickCore/quantum-export.c b/MagickCore/quantum-export.c index b7608162b..21c9c452a 100644 --- a/MagickCore/quantum-export.c +++ b/MagickCore/quantum-export.c @@ -886,6 +886,250 @@ static void ExportBGRAQuantum(const Image *image,QuantumInfo *quantum_info, } } +static void ExportBGROQuantum(const Image *image,QuantumInfo *quantum_info, + const MagickSizeType number_pixels,const Quantum *restrict p, + unsigned char *restrict q,ExceptionInfo *exception) +{ + QuantumAny + range; + + register ssize_t + x; + + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickSignature); + switch (quantum_info->depth) + { + case 8: + { + register unsigned char + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=ScaleQuantumToChar(GetPixelBlue(image,p)); + q=PopCharPixel(pixel,q); + pixel=ScaleQuantumToChar(GetPixelGreen(image,p)); + q=PopCharPixel(pixel,q); + pixel=ScaleQuantumToChar(GetPixelRed(image,p)); + q=PopCharPixel(pixel,q); + pixel=ScaleQuantumToChar(GetPixelOpacity(image,p)); + q=PopCharPixel(pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 10: + { + register unsigned int + pixel; + + range=GetQuantumRange(quantum_info->depth); + if (quantum_info->pack == MagickFalse) + { + register ssize_t + i; + + size_t + quantum; + + ssize_t + n; + + n=0; + quantum=0; + pixel=0; + for (x=0; x < (ssize_t) number_pixels; x++) + { + for (i=0; i < 4; i++) + { + switch (i) + { + case 0: quantum=GetPixelRed(image,p); break; + case 1: quantum=GetPixelGreen(image,p); break; + case 2: quantum=GetPixelBlue(image,p); break; + case 3: quantum=GetPixelOpacity(image,p); break; + } + switch (n % 3) + { + case 0: + { + pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum, + range) << 22); + break; + } + case 1: + { + pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum, + range) << 12); + break; + } + case 2: + { + pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum, + range) << 2); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=0; + break; + } + } + n++; + } + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + if (quantum_info->quantum == 32UL) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=(unsigned int) ScaleQuantumToAny(GetPixelRed(image,p),range); + q=PopQuantumLongPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelGreen(image,p), + range); + q=PopQuantumLongPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelBlue(image,p),range); + q=PopQuantumLongPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelOpacity(image,p), + range); + q=PopQuantumLongPixel(quantum_info,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=(unsigned int) ScaleQuantumToAny(GetPixelRed(image,p),range); + q=PopQuantumPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelGreen(image,p),range); + q=PopQuantumPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelBlue(image,p),range); + q=PopQuantumPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelOpacity(image,p),range); + q=PopQuantumPixel(quantum_info,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 16: + { + register unsigned short + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelBlue(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelGreen(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelRed(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelOpacity(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=ScaleQuantumToShort(GetPixelBlue(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToShort(GetPixelGreen(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToShort(GetPixelRed(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToShort(GetPixelOpacity(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 32: + { + register unsigned int + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + float + pixel; + + q=PopFloatPixel(quantum_info,(float) GetPixelRed(image,p),q); + q=PopFloatPixel(quantum_info,(float) GetPixelGreen(image,p),q); + q=PopFloatPixel(quantum_info,(float) GetPixelBlue(image,p),q); + pixel=(float) GetPixelOpacity(image,p); + q=PopFloatPixel(quantum_info,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=ScaleQuantumToLong(GetPixelBlue(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToLong(GetPixelGreen(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToLong(GetPixelRed(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToLong(GetPixelOpacity(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 64: + { + if (quantum_info->format == FloatingPointQuantumFormat) + { + double + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + q=PopDoublePixel(quantum_info,(double) GetPixelRed(image,p),q); + q=PopDoublePixel(quantum_info,(double) GetPixelGreen(image,p),q); + q=PopDoublePixel(quantum_info,(double) GetPixelBlue(image,p),q); + pixel=(double) GetPixelOpacity(image,p); + q=PopDoublePixel(quantum_info,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + } + default: + { + range=GetQuantumRange(quantum_info->depth); + for (x=0; x < (ssize_t) number_pixels; x++) + { + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelBlue(image,p), + range),q); + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelGreen(image,p), + range),q); + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelRed(image,p), + range),q); + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelOpacity(image,p), + range),q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + } +} + static void ExportBlackQuantum(const Image *image,QuantumInfo *quantum_info, const MagickSizeType number_pixels,const Quantum *restrict p, unsigned char *restrict q,ExceptionInfo *exception) @@ -1525,28 +1769,193 @@ static void ExportCMYKAQuantum(const Image *image,QuantumInfo *quantum_info, } } -static void ExportGrayQuantum(const Image *image,QuantumInfo *quantum_info, +static void ExportCMYKOQuantum(const Image *image,QuantumInfo *quantum_info, const MagickSizeType number_pixels,const Quantum *restrict p, unsigned char *restrict q,ExceptionInfo *exception) { - QuantumAny - range; - register ssize_t x; - assert(exception != (ExceptionInfo *) NULL); - assert(exception->signature == MagickSignature); + if (image->colorspace != CMYKColorspace) + { + (void) ThrowMagickException(exception,GetMagickModule(),ImageError, + "ColorSeparatedImageRequired","`%s'",image->filename); + return; + } switch (quantum_info->depth) { - case 1: + case 8: { - register double - threshold; - register unsigned char - black, - white; + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=ScaleQuantumToChar(GetPixelRed(image,p)); + q=PopCharPixel(pixel,q); + pixel=ScaleQuantumToChar(GetPixelGreen(image,p)); + q=PopCharPixel(pixel,q); + pixel=ScaleQuantumToChar(GetPixelBlue(image,p)); + q=PopCharPixel(pixel,q); + pixel=ScaleQuantumToChar(GetPixelBlack(image,p)); + q=PopCharPixel(pixel,q); + pixel=ScaleQuantumToChar(GetPixelOpacity(image,p)); + q=PopCharPixel(pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 16: + { + register unsigned short + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelRed(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelGreen(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelBlue(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelBlack(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelOpacity(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=ScaleQuantumToShort(GetPixelRed(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToShort(GetPixelGreen(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToShort(GetPixelBlue(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToShort(GetPixelBlack(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToShort(GetPixelOpacity(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 32: + { + register unsigned int + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + float + pixel; + + q=PopFloatPixel(quantum_info,(float) GetPixelRed(image,p),q); + q=PopFloatPixel(quantum_info,(float) GetPixelGreen(image,p),q); + q=PopFloatPixel(quantum_info,(float) GetPixelBlue(image,p),q); + q=PopFloatPixel(quantum_info,(float) GetPixelBlack(image,p),q); + pixel=(float) (GetPixelOpacity(image,p)); + q=PopFloatPixel(quantum_info,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=ScaleQuantumToLong(GetPixelRed(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToLong(GetPixelGreen(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToLong(GetPixelBlue(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToLong(GetPixelBlack(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToLong(GetPixelOpacity(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 64: + { + if (quantum_info->format == FloatingPointQuantumFormat) + { + double + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + q=PopDoublePixel(quantum_info,(double) GetPixelRed(image,p),q); + q=PopDoublePixel(quantum_info,(double) GetPixelGreen(image,p),q); + q=PopDoublePixel(quantum_info,(double) GetPixelBlue(image,p),q); + q=PopDoublePixel(quantum_info,(double) GetPixelBlack(image,p),q); + pixel=(double) (GetPixelOpacity(image,p)); + q=PopDoublePixel(quantum_info,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + } + default: + { + QuantumAny + range; + + range=GetQuantumRange(quantum_info->depth); + for (x=0; x < (ssize_t) number_pixels; x++) + { + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelRed(image,p), + range),q); + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelGreen(image,p), + range),q); + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelBlue(image,p), + range),q); + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelBlack(image,p), + range),q); + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelOpacity(image,p), + range),q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + } +} + +static void ExportGrayQuantum(const Image *image,QuantumInfo *quantum_info, + const MagickSizeType number_pixels,const Quantum *restrict p, + unsigned char *restrict q,ExceptionInfo *exception) +{ + QuantumAny + range; + + register ssize_t + x; + + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickSignature); + switch (quantum_info->depth) + { + case 1: + { + register double + threshold; + + register unsigned char + black, + white; ssize_t bit; @@ -3209,6 +3618,250 @@ static void ExportRGBAQuantum(const Image *image,QuantumInfo *quantum_info, } } +static void ExportRGBOQuantum(const Image *image,QuantumInfo *quantum_info, + const MagickSizeType number_pixels,const Quantum *restrict p, + unsigned char *restrict q,ExceptionInfo *exception) +{ + QuantumAny + range; + + register ssize_t + x; + + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickSignature); + switch (quantum_info->depth) + { + case 8: + { + register unsigned char + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=ScaleQuantumToChar(GetPixelRed(image,p)); + q=PopCharPixel(pixel,q); + pixel=ScaleQuantumToChar(GetPixelGreen(image,p)); + q=PopCharPixel(pixel,q); + pixel=ScaleQuantumToChar(GetPixelBlue(image,p)); + q=PopCharPixel(pixel,q); + pixel=ScaleQuantumToChar(GetPixelOpacity(image,p)); + q=PopCharPixel(pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 10: + { + register unsigned int + pixel; + + range=GetQuantumRange(quantum_info->depth); + if (quantum_info->pack == MagickFalse) + { + register ssize_t + i; + + size_t + quantum; + + ssize_t + n; + + n=0; + quantum=0; + pixel=0; + for (x=0; x < (ssize_t) number_pixels; x++) + { + for (i=0; i < 4; i++) + { + switch (i) + { + case 0: quantum=GetPixelRed(image,p); break; + case 1: quantum=GetPixelGreen(image,p); break; + case 2: quantum=GetPixelBlue(image,p); break; + case 3: quantum=GetPixelOpacity(image,p); break; + } + switch (n % 3) + { + case 0: + { + pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum, + range) << 22); + break; + } + case 1: + { + pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum, + range) << 12); + break; + } + case 2: + { + pixel|=(size_t) (ScaleQuantumToAny((Quantum) quantum, + range) << 2); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=0; + break; + } + } + n++; + } + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + if (quantum_info->quantum == 32UL) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=(unsigned int) ScaleQuantumToAny(GetPixelRed(image,p),range); + q=PopQuantumLongPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelGreen(image,p), + range); + q=PopQuantumLongPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelBlue(image,p),range); + q=PopQuantumLongPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelOpacity(image,p), + range); + q=PopQuantumLongPixel(quantum_info,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=(unsigned int) ScaleQuantumToAny(GetPixelRed(image,p),range); + q=PopQuantumPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelGreen(image,p),range); + q=PopQuantumPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelBlue(image,p),range); + q=PopQuantumPixel(quantum_info,pixel,q); + pixel=(unsigned int) ScaleQuantumToAny(GetPixelOpacity(image,p),range); + q=PopQuantumPixel(quantum_info,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 16: + { + register unsigned short + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelRed(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelGreen(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelBlue(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=SinglePrecisionToHalf(QuantumScale*GetPixelOpacity(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=ScaleQuantumToShort(GetPixelRed(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToShort(GetPixelGreen(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToShort(GetPixelBlue(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToShort(GetPixelOpacity(image,p)); + q=PopShortPixel(quantum_info->endian,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 32: + { + register unsigned int + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + float + pixel; + + q=PopFloatPixel(quantum_info,(float) GetPixelRed(image,p),q); + q=PopFloatPixel(quantum_info,(float) GetPixelGreen(image,p),q); + q=PopFloatPixel(quantum_info,(float) GetPixelBlue(image,p),q); + pixel=(float) GetPixelOpacity(image,p); + q=PopFloatPixel(quantum_info,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + pixel=ScaleQuantumToLong(GetPixelRed(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToLong(GetPixelGreen(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToLong(GetPixelBlue(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + pixel=ScaleQuantumToLong(GetPixelOpacity(image,p)); + q=PopLongPixel(quantum_info->endian,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + case 64: + { + if (quantum_info->format == FloatingPointQuantumFormat) + { + double + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + q=PopDoublePixel(quantum_info,(double) GetPixelRed(image,p),q); + q=PopDoublePixel(quantum_info,(double) GetPixelGreen(image,p),q); + q=PopDoublePixel(quantum_info,(double) GetPixelBlue(image,p),q); + pixel=(double) GetPixelOpacity(image,p); + q=PopDoublePixel(quantum_info,pixel,q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + } + default: + { + range=GetQuantumRange(quantum_info->depth); + for (x=0; x < (ssize_t) number_pixels; x++) + { + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelRed(image,p), + range),q); + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelGreen(image,p), + range),q); + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelBlue(image,p), + range),q); + q=PopQuantumPixel(quantum_info,ScaleQuantumToAny(GetPixelOpacity(image,p), + range),q); + p+=GetPixelChannels(image); + q+=quantum_info->pad; + } + break; + } + } +} + MagickExport size_t ExportQuantumPixels(const Image *image, CacheView *image_view,QuantumInfo *quantum_info, const QuantumType quantum_type,unsigned char *restrict pixels, @@ -3283,21 +3936,6 @@ MagickExport size_t ExportQuantumPixels(const Image *image, q+=GetPixelChannels(image); } } - if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum) || - (quantum_type == BGROQuantum)) - { - register Quantum - *restrict q; - - q=GetAuthenticPixelQueue(image); - if (image_view != (CacheView *) NULL) - q=GetCacheViewAuthenticPixelQueue(image_view); - for (x=0; x < (ssize_t) number_pixels; x++) - { - SetPixelAlpha(image,GetPixelAlpha(image,q),q); - q+=GetPixelChannels(image); - } - } if ((quantum_type == CbYCrQuantum) || (quantum_type == CbYCrAQuantum)) { Quantum @@ -3334,11 +3972,15 @@ MagickExport size_t ExportQuantumPixels(const Image *image, break; } case BGRAQuantum: - case BGROQuantum: { ExportBGRAQuantum(image,quantum_info,number_pixels,p,q,exception); break; } + case BGROQuantum: + { + ExportBGROQuantum(image,quantum_info,number_pixels,p,q,exception); + break; + } case BlackQuantum: { ExportBlackQuantum(image,quantum_info,number_pixels,p,q,exception); @@ -3356,11 +3998,15 @@ MagickExport size_t ExportQuantumPixels(const Image *image, break; } case CMYKAQuantum: - case CMYKOQuantum: { ExportCMYKAQuantum(image,quantum_info,number_pixels,p,q,exception); break; } + case CMYKOQuantum: + { + ExportCMYKOQuantum(image,quantum_info,number_pixels,p,q,exception); + break; + } case CbYCrYQuantum: { ExportCbYCrYQuantum(image,quantum_info,number_pixels,p,q,exception); @@ -3410,12 +4056,16 @@ MagickExport size_t ExportQuantumPixels(const Image *image, break; } case RGBAQuantum: - case RGBOQuantum: case CbYCrAQuantum: { ExportRGBAQuantum(image,quantum_info,number_pixels,p,q,exception); break; } + case RGBOQuantum: + { + ExportRGBOQuantum(image,quantum_info,number_pixels,p,q,exception); + break; + } default: break; } @@ -3438,20 +4088,5 @@ MagickExport size_t ExportQuantumPixels(const Image *image, q+=GetPixelChannels(image); } } - if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum) || - (quantum_type == BGROQuantum)) - { - register Quantum - *restrict q; - - q=GetAuthenticPixelQueue(image); - if (image_view != (CacheView *) NULL) - q=GetCacheViewAuthenticPixelQueue(image_view); - for (x=0; x < (ssize_t) number_pixels; x++) - { - SetPixelAlpha(image,GetPixelAlpha(image,q),q); - q+=GetPixelChannels(image); - } - } return(extent); } diff --git a/MagickCore/quantum-import.c b/MagickCore/quantum-import.c index a1464b83c..b9c975c16 100644 --- a/MagickCore/quantum-import.c +++ b/MagickCore/quantum-import.c @@ -913,6 +913,240 @@ static void ImportBGRAQuantum(const Image *image,QuantumInfo *quantum_info, } } +static void ImportBGROQuantum(const Image *image,QuantumInfo *quantum_info, + const MagickSizeType number_pixels,const unsigned char *restrict p, + Quantum *restrict q,ExceptionInfo *exception) +{ + QuantumAny + range; + + register ssize_t + x; + + unsigned int + pixel; + + assert(image != (Image *) NULL); + assert(image->signature == MagickSignature); + switch (quantum_info->depth) + { + case 8: + { + unsigned char + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushCharPixel(p,&pixel); + SetPixelBlue(image,ScaleCharToQuantum(pixel),q); + p=PushCharPixel(p,&pixel); + SetPixelGreen(image,ScaleCharToQuantum(pixel),q); + p=PushCharPixel(p,&pixel); + SetPixelRed(image,ScaleCharToQuantum(pixel),q); + p=PushCharPixel(p,&pixel); + SetPixelOpacity(image,ScaleCharToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + case 10: + { + pixel=0; + if (quantum_info->pack == MagickFalse) + { + register ssize_t + i; + + size_t + quantum; + + ssize_t + n; + + n=0; + quantum=0; + for (x=0; x < (ssize_t) number_pixels; x++) + { + for (i=0; i < 4; i++) + { + switch (n % 3) + { + case 0: + { + p=PushLongPixel(quantum_info->endian,p,&pixel); + quantum=(size_t) (ScaleShortToQuantum((unsigned short) + (((pixel >> 22) & 0x3ff) << 6))); + break; + } + case 1: + { + quantum=(size_t) (ScaleShortToQuantum((unsigned short) + (((pixel >> 12) & 0x3ff) << 6))); + break; + } + case 2: + { + quantum=(size_t) (ScaleShortToQuantum((unsigned short) + (((pixel >> 2) & 0x3ff) << 6))); + break; + } + } + switch (i) + { + case 0: SetPixelRed(image,(Quantum) quantum,q); break; + case 1: SetPixelGreen(image,(Quantum) quantum,q); break; + case 2: SetPixelBlue(image,(Quantum) quantum,q); break; + case 3: SetPixelOpacity(image,(Quantum) quantum,q); break; + } + n++; + } + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelRed(image,ScaleShortToQuantum((unsigned short) (pixel << 6)),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelGreen(image,ScaleShortToQuantum((unsigned short) (pixel << 6)), + q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelBlue(image,ScaleShortToQuantum((unsigned short) (pixel << 6)), + q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ScaleShortToQuantum((unsigned short) (pixel << 6)), + q); + q+=GetPixelChannels(image); + } + break; + } + case 16: + { + unsigned short + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelRed(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelGreen(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelBlue(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelOpacity(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelBlue(image,ScaleShortToQuantum(pixel),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelGreen(image,ScaleShortToQuantum(pixel),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelRed(image,ScaleShortToQuantum(pixel),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelOpacity(image,ScaleShortToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + case 32: + { + unsigned int + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + float + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelRed(image,ClampToQuantum(pixel),q); + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelGreen(image,ClampToQuantum(pixel),q); + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelBlue(image,ClampToQuantum(pixel),q); + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ClampToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelBlue(image,ScaleLongToQuantum(pixel),q); + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelGreen(image,ScaleLongToQuantum(pixel),q); + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelRed(image,ScaleLongToQuantum(pixel),q); + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelOpacity(image,ScaleLongToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + case 64: + { + if (quantum_info->format == FloatingPointQuantumFormat) + { + double + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelRed(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelGreen(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelBlue(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ClampToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + } + default: + { + range=GetQuantumRange(quantum_info->depth); + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelBlue(image,ScaleAnyToQuantum(pixel,range),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelGreen(image,ScaleAnyToQuantum(pixel,range),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelRed(image,ScaleAnyToQuantum(pixel,range),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ScaleAnyToQuantum(pixel,range),q); + q+=GetPixelChannels(image); + } + break; + } + } +} + static void ImportBlackQuantum(const Image *image,QuantumInfo *quantum_info, const MagickSizeType number_pixels,const unsigned char *restrict p, Quantum *restrict q,ExceptionInfo *exception) @@ -1591,7 +1825,7 @@ static void ImportCMYKAQuantum(const Image *image,QuantumInfo *quantum_info, } } -static void ImportGrayQuantum(const Image *image,QuantumInfo *quantum_info, +static void ImportCMYKOQuantum(const Image *image,QuantumInfo *quantum_info, const MagickSizeType number_pixels,const unsigned char *restrict p, Quantum *restrict q,ExceptionInfo *exception) { @@ -1601,28 +1835,209 @@ static void ImportGrayQuantum(const Image *image,QuantumInfo *quantum_info, register ssize_t x; - ssize_t - bit; - unsigned int pixel; - assert(image != (Image *) NULL); - assert(image->signature == MagickSignature); + if (image->colorspace != CMYKColorspace) + { + (void) ThrowMagickException(exception,GetMagickModule(),ImageError, + "ColorSeparatedImageRequired","`%s'",image->filename); + return; + } switch (quantum_info->depth) { - case 1: + case 8: { - register Quantum - black, - white; + unsigned char + pixel; - black=0; - white=QuantumRange; - if (quantum_info->min_is_white != MagickFalse) - { - black=QuantumRange; - white=0; + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushCharPixel(p,&pixel); + SetPixelRed(image,ScaleCharToQuantum(pixel),q); + p=PushCharPixel(p,&pixel); + SetPixelGreen(image,ScaleCharToQuantum(pixel),q); + p=PushCharPixel(p,&pixel); + SetPixelBlue(image,ScaleCharToQuantum(pixel),q); + p=PushCharPixel(p,&pixel); + SetPixelBlack(image,ScaleCharToQuantum(pixel),q); + p=PushCharPixel(p,&pixel); + SetPixelOpacity(image,ScaleCharToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + case 16: + { + unsigned short + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelRed(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelGreen(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelBlue(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelBlack(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelOpacity(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelRed(image,ScaleShortToQuantum(pixel),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelGreen(image,ScaleShortToQuantum(pixel),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelBlue(image,ScaleShortToQuantum(pixel),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelBlack(image,ScaleShortToQuantum(pixel),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelOpacity(image,ScaleShortToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + case 32: + { + unsigned int + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + float + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelRed(image,ClampToQuantum(pixel),q); + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelGreen(image,ClampToQuantum(pixel),q); + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelBlue(image,ClampToQuantum(pixel),q); + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelBlack(image,ClampToQuantum(pixel),q); + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ClampToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelRed(image,ScaleLongToQuantum(pixel),q); + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelGreen(image,ScaleLongToQuantum(pixel),q); + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelBlue(image,ScaleLongToQuantum(pixel),q); + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelBlack(image,ScaleLongToQuantum(pixel),q); + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelOpacity(image,ScaleLongToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + case 64: + { + if (quantum_info->format == FloatingPointQuantumFormat) + { + double + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelRed(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelGreen(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelBlue(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelBlack(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + } + default: + { + range=GetQuantumRange(quantum_info->depth); + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelRed(image,ScaleAnyToQuantum(pixel,range),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelGreen(image,ScaleAnyToQuantum(pixel,range),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelBlue(image,ScaleAnyToQuantum(pixel,range),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelBlack(image,ScaleAnyToQuantum(pixel,range),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ScaleAnyToQuantum(pixel,range),q); + q+=GetPixelChannels(image); + } + break; + } + } +} + +static void ImportGrayQuantum(const Image *image,QuantumInfo *quantum_info, + const MagickSizeType number_pixels,const unsigned char *restrict p, + Quantum *restrict q,ExceptionInfo *exception) +{ + QuantumAny + range; + + register ssize_t + x; + + ssize_t + bit; + + unsigned int + pixel; + + assert(image != (Image *) NULL); + assert(image->signature == MagickSignature); + switch (quantum_info->depth) + { + case 1: + { + register Quantum + black, + white; + + black=0; + white=QuantumRange; + if (quantum_info->min_is_white != MagickFalse) + { + black=QuantumRange; + white=0; } for (x=0; x < ((ssize_t) number_pixels-7); x+=8) { @@ -3438,6 +3853,240 @@ static void ImportRGBAQuantum(const Image *image,QuantumInfo *quantum_info, } } +static void ImportRGBOQuantum(const Image *image,QuantumInfo *quantum_info, + const MagickSizeType number_pixels,const unsigned char *restrict p, + Quantum *restrict q,ExceptionInfo *exception) +{ + QuantumAny + range; + + register ssize_t + x; + + unsigned int + pixel; + + assert(image != (Image *) NULL); + assert(image->signature == MagickSignature); + switch (quantum_info->depth) + { + case 8: + { + unsigned char + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushCharPixel(p,&pixel); + SetPixelRed(image,ScaleCharToQuantum(pixel),q); + p=PushCharPixel(p,&pixel); + SetPixelGreen(image,ScaleCharToQuantum(pixel),q); + p=PushCharPixel(p,&pixel); + SetPixelBlue(image,ScaleCharToQuantum(pixel),q); + p=PushCharPixel(p,&pixel); + SetPixelOpacity(image,ScaleCharToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + case 10: + { + pixel=0; + if (quantum_info->pack == MagickFalse) + { + register ssize_t + i; + + size_t + quantum; + + ssize_t + n; + + n=0; + quantum=0; + for (x=0; x < (ssize_t) number_pixels; x++) + { + for (i=0; i < 4; i++) + { + switch (n % 3) + { + case 0: + { + p=PushLongPixel(quantum_info->endian,p,&pixel); + quantum=(size_t) (ScaleShortToQuantum((unsigned short) + (((pixel >> 22) & 0x3ff) << 6))); + break; + } + case 1: + { + quantum=(size_t) (ScaleShortToQuantum((unsigned short) + (((pixel >> 12) & 0x3ff) << 6))); + break; + } + case 2: + { + quantum=(size_t) (ScaleShortToQuantum((unsigned short) + (((pixel >> 2) & 0x3ff) << 6))); + break; + } + } + switch (i) + { + case 0: SetPixelRed(image,(Quantum) quantum,q); break; + case 1: SetPixelGreen(image,(Quantum) quantum,q); break; + case 2: SetPixelBlue(image,(Quantum) quantum,q); break; + case 3: SetPixelOpacity(image,(Quantum) quantum,q); break; + } + n++; + } + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelRed(image,ScaleShortToQuantum((unsigned short) (pixel << 6)),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelGreen(image,ScaleShortToQuantum((unsigned short) (pixel << 6)), + q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelBlue(image,ScaleShortToQuantum((unsigned short) (pixel << 6)), + q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ScaleShortToQuantum((unsigned short) (pixel << 6)), + q); + q+=GetPixelChannels(image); + } + break; + } + case 16: + { + unsigned short + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelRed(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelGreen(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelBlue(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelOpacity(image,ClampToQuantum(QuantumRange* + HalfToSinglePrecision(pixel)),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelRed(image,ScaleShortToQuantum(pixel),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelGreen(image,ScaleShortToQuantum(pixel),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelBlue(image,ScaleShortToQuantum(pixel),q); + p=PushShortPixel(quantum_info->endian,p,&pixel); + SetPixelOpacity(image,ScaleShortToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + case 32: + { + unsigned int + pixel; + + if (quantum_info->format == FloatingPointQuantumFormat) + { + float + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelRed(image,ClampToQuantum(pixel),q); + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelGreen(image,ClampToQuantum(pixel),q); + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelBlue(image,ClampToQuantum(pixel),q); + p=PushFloatPixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ClampToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelRed(image,ScaleLongToQuantum(pixel),q); + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelGreen(image,ScaleLongToQuantum(pixel),q); + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelBlue(image,ScaleLongToQuantum(pixel),q); + p=PushLongPixel(quantum_info->endian,p,&pixel); + SetPixelOpacity(image,ScaleLongToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + case 64: + { + if (quantum_info->format == FloatingPointQuantumFormat) + { + double + pixel; + + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelRed(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelGreen(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelBlue(image,ClampToQuantum(pixel),q); + p=PushDoublePixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ClampToQuantum(pixel),q); + p+=quantum_info->pad; + q+=GetPixelChannels(image); + } + break; + } + } + default: + { + range=GetQuantumRange(quantum_info->depth); + for (x=0; x < (ssize_t) number_pixels; x++) + { + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelRed(image,ScaleAnyToQuantum(pixel,range),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelGreen(image,ScaleAnyToQuantum(pixel,range),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelBlue(image,ScaleAnyToQuantum(pixel,range),q); + p=PushQuantumPixel(quantum_info,p,&pixel); + SetPixelOpacity(image,ScaleAnyToQuantum(pixel,range),q); + q+=GetPixelChannels(image); + } + break; + } + } +} + MagickExport size_t ImportQuantumPixels(const Image *image, CacheView *image_view,QuantumInfo *quantum_info, const QuantumType quantum_type,const unsigned char *restrict pixels, @@ -3493,11 +4142,15 @@ MagickExport size_t ImportQuantumPixels(const Image *image, break; } case BGRAQuantum: - case BGROQuantum: { ImportBGRAQuantum(image,quantum_info,number_pixels,p,q,exception); break; } + case BGROQuantum: + { + ImportBGROQuantum(image,quantum_info,number_pixels,p,q,exception); + break; + } case BlackQuantum: { ImportBlackQuantum(image,quantum_info,number_pixels,p,q,exception); @@ -3515,11 +4168,15 @@ MagickExport size_t ImportQuantumPixels(const Image *image, break; } case CMYKAQuantum: - case CMYKOQuantum: { ImportCMYKAQuantum(image,quantum_info,number_pixels,p,q,exception); break; } + case CMYKOQuantum: + { + ImportCMYKOQuantum(image,quantum_info,number_pixels,p,q,exception); + break; + } case CbYCrYQuantum: { ImportCbYCrYQuantum(image,quantum_info,number_pixels,p,q,exception); @@ -3569,12 +4226,16 @@ MagickExport size_t ImportQuantumPixels(const Image *image, break; } case RGBAQuantum: - case RGBOQuantum: case CbYCrAQuantum: { ImportRGBAQuantum(image,quantum_info,number_pixels,p,q,exception); break; } + case RGBOQuantum: + { + ImportRGBOQuantum(image,quantum_info,number_pixels,p,q,exception); + break; + } default: break; } @@ -3597,21 +4258,6 @@ MagickExport size_t ImportQuantumPixels(const Image *image, q+=GetPixelChannels(image); } } - if ((quantum_type == RGBOQuantum) || (quantum_type == CMYKOQuantum) || - (quantum_type == BGROQuantum)) - { - register Quantum - *restrict q; - - q=GetAuthenticPixelQueue(image); - if (image_view != (CacheView *) NULL) - q=GetCacheViewAuthenticPixelQueue(image_view); - for (x=0; x < (ssize_t) number_pixels; x++) - { - SetPixelOpacity(image,GetPixelAlpha(image,q),q); - q+=GetPixelChannels(image); - } - } if (quantum_info->alpha_type == DisassociatedQuantumAlpha) { double -- 2.40.0