From: cristy Date: Sat, 4 May 2013 22:26:12 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~3737 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e1ca83966a785a952a4f056f6047a91389ee99a3;p=imagemagick --- diff --git a/MagickCore/colorspace.c b/MagickCore/colorspace.c index 432bf7f8f..d7ed15b17 100644 --- a/MagickCore/colorspace.c +++ b/MagickCore/colorspace.c @@ -137,6 +137,34 @@ static inline void ConvertXYZToLMS(const double x,const double y, *S=QuantumRange*s; } +static void ConvertRGBToYPbPr(const double red,const double green, + const double blue,double *Y,double *Pb,double *Pr) +{ + /* + Convert RGB to YPbPr colorspace. + */ + assert(Y != (double *) NULL); + assert(Pb != (double *) NULL); + assert(Pr != (double *) NULL); + *Y=0.298839*red+0.586811*green+0.114350*blue; + *Pb=(-0.1687367)*red-0.331264*green+0.5*blue; + *Pr=0.5*red-0.418688*green-0.081312*blue; +} + +static void ConvertRGBToYCbCr(const double red,const double green, + const double blue,double *Y,double *Cb,double *Cr) +{ + /* + Convert RGB to -YCbCr colorspace. + */ + assert(Y != (double *) NULL); + assert(Cb != (double *) NULL); + assert(Cr != (double *) NULL); + ConvertRGBToYPbPr(red,green,blue,Y,Cb,Cr); + *Cb+=0.5; + *Cr+=0.5; +} + static MagickBooleanType sRGBTransformImage(Image *image, const ColorspaceType colorspace,ExceptionInfo *exception) { @@ -356,7 +384,13 @@ static MagickBooleanType sRGBTransformImage(Image *image, image->type=GrayscaleType; return(status); } + case HCLColorspace: + case HCLpColorspace: + case HSBColorspace: case HSIColorspace: + case HSLColorspace: + case HSVColorspace: + case HWBColorspace: { /* Transform image from sRGB to target colorspace. @@ -418,11 +452,31 @@ static MagickBooleanType sRGBTransformImage(Image *image, ConvertRGBToHCLp(red,green,blue,&X,&Y,&Z); break; } + case HSBColorspace: + { + ConvertRGBToHSB(red,green,blue,&X,&Y,&Z); + break; + } case HSIColorspace: { ConvertRGBToHSI(red,green,blue,&X,&Y,&Z); break; } + case HSLColorspace: + { + ConvertRGBToHSL(red,green,blue,&X,&Y,&Z); + break; + } + case HSVColorspace: + { + ConvertRGBToHSV(red,green,blue,&X,&Y,&Z); + break; + } + case HWBColorspace: + { + ConvertRGBToHWB(red,green,blue,&X,&Y,&Z); + break; + } default: break; } @@ -440,10 +494,10 @@ static MagickBooleanType sRGBTransformImage(Image *image, return(MagickFalse); return(status); } - case HSBColorspace: + case LabColorspace: { /* - Transform image from sRGB to HSB. + Transform image from sRGB to Lab. */ if (image->storage_class == PseudoClass) { @@ -480,20 +534,24 @@ static MagickBooleanType sRGBTransformImage(Image *image, for (x=0; x < (ssize_t) image->columns; x++) { double + a, + b, blue, - brightness, green, - hue, + L, red, - saturation; + X, + Y, + Z; - red=(double) GetPixelRed(image,q); - green=(double) GetPixelGreen(image,q); - blue=(double) GetPixelBlue(image,q); - ConvertRGBToHSB(red,green,blue,&hue,&saturation,&brightness); - SetPixelRed(image,ClampToQuantum(QuantumRange*hue),q); - SetPixelGreen(image,ClampToQuantum(QuantumRange*saturation),q); - SetPixelBlue(image,ClampToQuantum(QuantumRange*brightness),q); + red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q)); + green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q)); + blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q)); + ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); + ConvertXYZToLab(X,Y,Z,&L,&a,&b); + SetPixelRed(image,ClampToQuantum(QuantumRange*L),q); + SetPixelGreen(image,ClampToQuantum(QuantumRange*a),q); + SetPixelBlue(image,ClampToQuantum(QuantumRange*b),q); q+=GetPixelChannels(image); } sync=SyncCacheViewAuthenticPixels(image_view,exception); @@ -505,10 +563,11 @@ static MagickBooleanType sRGBTransformImage(Image *image, return(MagickFalse); return(status); } - case HSLColorspace: + case LCHColorspace: + case LCHabColorspace: { /* - Transform image from sRGB to HSL. + Transform image from sRGB to LCHab. */ if (image->storage_class == PseudoClass) { @@ -546,19 +605,19 @@ static MagickBooleanType sRGBTransformImage(Image *image, { double blue, + chroma, green, hue, - lightness, - red, - saturation; + luma, + red; red=(double) GetPixelRed(image,q); green=(double) GetPixelGreen(image,q); blue=(double) GetPixelBlue(image,q); - ConvertRGBToHSL(red,green,blue,&hue,&saturation,&lightness); - SetPixelRed(image,ClampToQuantum(QuantumRange*hue),q); - SetPixelGreen(image,ClampToQuantum(QuantumRange*saturation),q); - SetPixelBlue(image,ClampToQuantum(QuantumRange*lightness),q); + ConvertRGBToLCHab(red,green,blue,&luma,&chroma,&hue); + SetPixelRed(image,ClampToQuantum(QuantumRange*luma),q); + SetPixelGreen(image,ClampToQuantum(QuantumRange*chroma),q); + SetPixelBlue(image,ClampToQuantum(QuantumRange*hue),q); q+=GetPixelChannels(image); } sync=SyncCacheViewAuthenticPixels(image_view,exception); @@ -570,10 +629,10 @@ static MagickBooleanType sRGBTransformImage(Image *image, return(MagickFalse); return(status); } - case HSVColorspace: + case LCHuvColorspace: { /* - Transform image from sRGB to HSV. + Transform image from sRGB to LCHuv. */ if (image->storage_class == PseudoClass) { @@ -611,19 +670,19 @@ static MagickBooleanType sRGBTransformImage(Image *image, { double blue, + chroma, green, hue, - red, - saturation, - value; + luma, + red; red=(double) GetPixelRed(image,q); green=(double) GetPixelGreen(image,q); blue=(double) GetPixelBlue(image,q); - ConvertRGBToHSV(red,green,blue,&hue,&saturation,&value); - SetPixelRed(image,ClampToQuantum(QuantumRange*hue),q); - SetPixelGreen(image,ClampToQuantum(QuantumRange*saturation),q); - SetPixelBlue(image,ClampToQuantum(QuantumRange*value),q); + ConvertRGBToLCHuv(red,green,blue,&luma,&chroma,&hue); + SetPixelRed(image,ClampToQuantum(QuantumRange*luma),q); + SetPixelGreen(image,ClampToQuantum(QuantumRange*chroma),q); + SetPixelBlue(image,ClampToQuantum(QuantumRange*hue),q); q+=GetPixelChannels(image); } sync=SyncCacheViewAuthenticPixels(image_view,exception); @@ -635,10 +694,10 @@ static MagickBooleanType sRGBTransformImage(Image *image, return(MagickFalse); return(status); } - case HWBColorspace: + case LMSColorspace: { /* - Transform image from sRGB to HWB. + Transform image from sRGB to LMS. */ if (image->storage_class == PseudoClass) { @@ -675,20 +734,24 @@ static MagickBooleanType sRGBTransformImage(Image *image, for (x=0; x < (ssize_t) image->columns; x++) { double - blackness, blue, green, - hue, + L, + M, red, - whiteness; + S, + X, + Y, + Z; - red=(double) GetPixelRed(image,q); - green=(double) GetPixelGreen(image,q); - blue=(double) GetPixelBlue(image,q); - ConvertRGBToHWB(red,green,blue,&hue,&whiteness,&blackness); - SetPixelRed(image,ClampToQuantum(QuantumRange*hue),q); - SetPixelGreen(image,ClampToQuantum(QuantumRange*whiteness),q); - SetPixelBlue(image,ClampToQuantum(QuantumRange*blackness),q); + red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q)); + green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q)); + blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q)); + ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); + ConvertXYZToLMS(X,Y,Z,&L,&M,&S); + SetPixelRed(image,ClampToQuantum(QuantumRange*L),q); + SetPixelGreen(image,ClampToQuantum(QuantumRange*M),q); + SetPixelBlue(image,ClampToQuantum(QuantumRange*S),q); q+=GetPixelChannels(image); } sync=SyncCacheViewAuthenticPixels(image_view,exception); @@ -700,18 +763,62 @@ static MagickBooleanType sRGBTransformImage(Image *image, return(MagickFalse); return(status); } - case LabColorspace: + case LogColorspace: { +#define DisplayGamma (1.0/1.7) +#define FilmGamma 0.6 +#define ReferenceBlack 95.0 +#define ReferenceWhite 685.0 + + const char + *value; + + double + black, + density, + film_gamma, + gamma, + reference_black, + reference_white; + + Quantum + *logmap; + /* - Transform image from sRGB to Lab. + Transform RGB to Log colorspace. */ - if (image->storage_class == PseudoClass) - { - if (SyncImage(image,exception) == MagickFalse) - return(MagickFalse); - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); - } + density=DisplayGamma; + gamma=DisplayGamma; + value=GetImageProperty(image,"gamma",exception); + if (value != (const char *) NULL) + gamma=PerceptibleReciprocal(StringToDouble(value,(char **) NULL)); + film_gamma=FilmGamma; + value=GetImageProperty(image,"film-gamma",exception); + if (value != (const char *) NULL) + film_gamma=StringToDouble(value,(char **) NULL); + reference_black=ReferenceBlack; + value=GetImageProperty(image,"reference-black",exception); + if (value != (const char *) NULL) + reference_black=StringToDouble(value,(char **) NULL); + reference_white=ReferenceWhite; + value=GetImageProperty(image,"reference-white",exception); + if (value != (const char *) NULL) + reference_white=StringToDouble(value,(char **) NULL); + logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL, + sizeof(*logmap)); + if (logmap == (Quantum *) NULL) + ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", + image->filename); + black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002/ + film_gamma); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static,4) \ + magick_threads(image,image,1,1) +#endif + for (i=0; i <= (ssize_t) MaxMap; i++) + logmap[i]=ScaleMapToQuantum((double) (MaxMap*(reference_white+ + log10(black+(1.0*i/MaxMap)*(1.0-black))/((gamma/density)*0.002/ + film_gamma))/1024.0)); image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(status) \ @@ -737,27 +844,20 @@ static MagickBooleanType sRGBTransformImage(Image *image, status=MagickFalse; continue; } - for (x=0; x < (ssize_t) image->columns; x++) + for (x=(ssize_t) image->columns; x != 0; x--) { double - a, - b, blue, green, - L, - red, - X, - Y, - Z; + red; - red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q)); - green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q)); - blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q)); - ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); - ConvertXYZToLab(X,Y,Z,&L,&a,&b); - SetPixelRed(image,ClampToQuantum(QuantumRange*L),q); - SetPixelGreen(image,ClampToQuantum(QuantumRange*a),q); - SetPixelBlue(image,ClampToQuantum(QuantumRange*b),q); + red=(double) GetPixelRed(image,q); + green=(double) GetPixelGreen(image,q); + blue=(double) GetPixelBlue(image,q); + SetPixelRed(image,logmap[ScaleQuantumToMap(ClampToQuantum(red))],q); + SetPixelGreen(image,logmap[ScaleQuantumToMap(ClampToQuantum(green))], + q); + SetPixelBlue(image,logmap[ScaleQuantumToMap(ClampToQuantum(blue))],q); q+=GetPixelChannels(image); } sync=SyncCacheViewAuthenticPixels(image_view,exception); @@ -765,15 +865,15 @@ static MagickBooleanType sRGBTransformImage(Image *image, status=MagickFalse; } image_view=DestroyCacheView(image_view); + logmap=(Quantum *) RelinquishMagickMemory(logmap); if (SetImageColorspace(image,colorspace,exception) == MagickFalse) return(MagickFalse); return(status); } - case LCHColorspace: - case LCHabColorspace: + case LuvColorspace: { /* - Transform image from sRGB to LCHab. + Transform image from sRGB to Luv. */ if (image->storage_class == PseudoClass) { @@ -811,19 +911,23 @@ static MagickBooleanType sRGBTransformImage(Image *image, { double blue, - chroma, green, - hue, - luma, - red; + L, + red, + u, + v, + X, + Y, + Z; - red=(double) GetPixelRed(image,q); - green=(double) GetPixelGreen(image,q); - blue=(double) GetPixelBlue(image,q); - ConvertRGBToLCHab(red,green,blue,&luma,&chroma,&hue); - SetPixelRed(image,ClampToQuantum(QuantumRange*luma),q); - SetPixelGreen(image,ClampToQuantum(QuantumRange*chroma),q); - SetPixelBlue(image,ClampToQuantum(QuantumRange*hue),q); + red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q)); + green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q)); + blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q)); + ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); + ConvertXYZToLuv(X,Y,Z,&L,&u,&v); + SetPixelRed(image,ClampToQuantum(QuantumRange*L),q); + SetPixelGreen(image,ClampToQuantum(QuantumRange*u),q); + SetPixelBlue(image,ClampToQuantum(QuantumRange*v),q); q+=GetPixelChannels(image); } sync=SyncCacheViewAuthenticPixels(image_view,exception); @@ -835,10 +939,11 @@ static MagickBooleanType sRGBTransformImage(Image *image, return(MagickFalse); return(status); } - case LCHuvColorspace: + case RGBColorspace: + case scRGBColorspace: { /* - Transform image from sRGB to LCHuv. + Transform image from sRGB to linear RGB. */ if (image->storage_class == PseudoClass) { @@ -876,19 +981,15 @@ static MagickBooleanType sRGBTransformImage(Image *image, { double blue, - chroma, green, - hue, - luma, red; - red=(double) GetPixelRed(image,q); - green=(double) GetPixelGreen(image,q); - blue=(double) GetPixelBlue(image,q); - ConvertRGBToLCHuv(red,green,blue,&luma,&chroma,&hue); - SetPixelRed(image,ClampToQuantum(QuantumRange*luma),q); - SetPixelGreen(image,ClampToQuantum(QuantumRange*chroma),q); - SetPixelBlue(image,ClampToQuantum(QuantumRange*hue),q); + red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q)); + green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q)); + blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q)); + SetPixelRed(image,ClampToQuantum(red),q); + SetPixelGreen(image,ClampToQuantum(green),q); + SetPixelBlue(image,ClampToQuantum(blue),q); q+=GetPixelChannels(image); } sync=SyncCacheViewAuthenticPixels(image_view,exception); @@ -900,10 +1001,10 @@ static MagickBooleanType sRGBTransformImage(Image *image, return(MagickFalse); return(status); } - case LMSColorspace: + case XYZColorspace: { /* - Transform image from sRGB to LMS. + Transform image from sRGB to XYZ. */ if (image->storage_class == PseudoClass) { @@ -942,10 +1043,7 @@ static MagickBooleanType sRGBTransformImage(Image *image, double blue, green, - L, - M, red, - S, X, Y, Z; @@ -954,313 +1052,9 @@ static MagickBooleanType sRGBTransformImage(Image *image, green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q)); blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q)); ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); - ConvertXYZToLMS(X,Y,Z,&L,&M,&S); - SetPixelRed(image,ClampToQuantum(QuantumRange*L),q); - SetPixelGreen(image,ClampToQuantum(QuantumRange*M),q); - SetPixelBlue(image,ClampToQuantum(QuantumRange*S),q); - q+=GetPixelChannels(image); - } - sync=SyncCacheViewAuthenticPixels(image_view,exception); - if (sync == MagickFalse) - status=MagickFalse; - } - image_view=DestroyCacheView(image_view); - if (SetImageColorspace(image,colorspace,exception) == MagickFalse) - return(MagickFalse); - return(status); - } - case LogColorspace: - { -#define DisplayGamma (1.0/1.7) -#define FilmGamma 0.6 -#define ReferenceBlack 95.0 -#define ReferenceWhite 685.0 - - const char - *value; - - double - black, - density, - film_gamma, - gamma, - reference_black, - reference_white; - - Quantum - *logmap; - - /* - Transform RGB to Log colorspace. - */ - density=DisplayGamma; - gamma=DisplayGamma; - value=GetImageProperty(image,"gamma",exception); - if (value != (const char *) NULL) - gamma=PerceptibleReciprocal(StringToDouble(value,(char **) NULL)); - film_gamma=FilmGamma; - value=GetImageProperty(image,"film-gamma",exception); - if (value != (const char *) NULL) - film_gamma=StringToDouble(value,(char **) NULL); - reference_black=ReferenceBlack; - value=GetImageProperty(image,"reference-black",exception); - if (value != (const char *) NULL) - reference_black=StringToDouble(value,(char **) NULL); - reference_white=ReferenceWhite; - value=GetImageProperty(image,"reference-white",exception); - if (value != (const char *) NULL) - reference_white=StringToDouble(value,(char **) NULL); - logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL, - sizeof(*logmap)); - if (logmap == (Quantum *) NULL) - ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", - image->filename); - black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002/ - film_gamma); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) \ - magick_threads(image,image,1,1) -#endif - for (i=0; i <= (ssize_t) MaxMap; i++) - logmap[i]=ScaleMapToQuantum((double) (MaxMap*(reference_white+ - log10(black+(1.0*i/MaxMap)*(1.0-black))/((gamma/density)*0.002/ - film_gamma))/1024.0)); - image_view=AcquireAuthenticCacheView(image,exception); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(status) \ - magick_threads(image,image,image->rows,1) -#endif - for (y=0; y < (ssize_t) image->rows; y++) - { - MagickBooleanType - sync; - - register ssize_t - x; - - register Quantum - *restrict q; - - if (status == MagickFalse) - continue; - q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, - exception); - if (q == (Quantum *) NULL) - { - status=MagickFalse; - continue; - } - for (x=(ssize_t) image->columns; x != 0; x--) - { - double - blue, - green, - red; - - red=(double) GetPixelRed(image,q); - green=(double) GetPixelGreen(image,q); - blue=(double) GetPixelBlue(image,q); - SetPixelRed(image,logmap[ScaleQuantumToMap(ClampToQuantum(red))],q); - SetPixelGreen(image,logmap[ScaleQuantumToMap(ClampToQuantum(green))], - q); - SetPixelBlue(image,logmap[ScaleQuantumToMap(ClampToQuantum(blue))],q); - q+=GetPixelChannels(image); - } - sync=SyncCacheViewAuthenticPixels(image_view,exception); - if (sync == MagickFalse) - status=MagickFalse; - } - image_view=DestroyCacheView(image_view); - logmap=(Quantum *) RelinquishMagickMemory(logmap); - if (SetImageColorspace(image,colorspace,exception) == MagickFalse) - return(MagickFalse); - return(status); - } - case LuvColorspace: - { - /* - Transform image from sRGB to Luv. - */ - if (image->storage_class == PseudoClass) - { - if (SyncImage(image,exception) == MagickFalse) - return(MagickFalse); - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); - } - image_view=AcquireAuthenticCacheView(image,exception); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(status) \ - magick_threads(image,image,image->rows,1) -#endif - for (y=0; y < (ssize_t) image->rows; y++) - { - MagickBooleanType - sync; - - register ssize_t - x; - - register Quantum - *restrict q; - - if (status == MagickFalse) - continue; - q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, - exception); - if (q == (Quantum *) NULL) - { - status=MagickFalse; - continue; - } - for (x=0; x < (ssize_t) image->columns; x++) - { - double - blue, - green, - L, - red, - u, - v, - X, - Y, - Z; - - red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q)); - green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q)); - blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q)); - ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); - ConvertXYZToLuv(X,Y,Z,&L,&u,&v); - SetPixelRed(image,ClampToQuantum(QuantumRange*L),q); - SetPixelGreen(image,ClampToQuantum(QuantumRange*u),q); - SetPixelBlue(image,ClampToQuantum(QuantumRange*v),q); - q+=GetPixelChannels(image); - } - sync=SyncCacheViewAuthenticPixels(image_view,exception); - if (sync == MagickFalse) - status=MagickFalse; - } - image_view=DestroyCacheView(image_view); - if (SetImageColorspace(image,colorspace,exception) == MagickFalse) - return(MagickFalse); - return(status); - } - case RGBColorspace: - case scRGBColorspace: - { - /* - Transform image from sRGB to linear RGB. - */ - if (image->storage_class == PseudoClass) - { - if (SyncImage(image,exception) == MagickFalse) - return(MagickFalse); - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); - } - image_view=AcquireAuthenticCacheView(image,exception); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(status) \ - magick_threads(image,image,image->rows,1) -#endif - for (y=0; y < (ssize_t) image->rows; y++) - { - MagickBooleanType - sync; - - register ssize_t - x; - - register Quantum - *restrict q; - - if (status == MagickFalse) - continue; - q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, - exception); - if (q == (Quantum *) NULL) - { - status=MagickFalse; - continue; - } - for (x=0; x < (ssize_t) image->columns; x++) - { - double - blue, - green, - red; - - red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q)); - green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q)); - blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q)); - SetPixelRed(image,ClampToQuantum(red),q); - SetPixelGreen(image,ClampToQuantum(green),q); - SetPixelBlue(image,ClampToQuantum(blue),q); - q+=GetPixelChannels(image); - } - sync=SyncCacheViewAuthenticPixels(image_view,exception); - if (sync == MagickFalse) - status=MagickFalse; - } - image_view=DestroyCacheView(image_view); - if (SetImageColorspace(image,colorspace,exception) == MagickFalse) - return(MagickFalse); - return(status); - } - case XYZColorspace: - { - /* - Transform image from sRGB to XYZ. - */ - if (image->storage_class == PseudoClass) - { - if (SyncImage(image,exception) == MagickFalse) - return(MagickFalse); - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); - } - image_view=AcquireAuthenticCacheView(image,exception); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(status) \ - magick_threads(image,image,image->rows,1) -#endif - for (y=0; y < (ssize_t) image->rows; y++) - { - MagickBooleanType - sync; - - register ssize_t - x; - - register Quantum - *restrict q; - - if (status == MagickFalse) - continue; - q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, - exception); - if (q == (Quantum *) NULL) - { - status=MagickFalse; - continue; - } - for (x=0; x < (ssize_t) image->columns; x++) - { - double - blue, - green, - red, - X, - Y, - Z; - - red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q)); - green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q)); - blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q)); - ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); - SetPixelRed(image,ClampToQuantum(QuantumRange*X),q); - SetPixelGreen(image,ClampToQuantum(QuantumRange*Y),q); - SetPixelBlue(image,ClampToQuantum(QuantumRange*Z),q); + SetPixelRed(image,ClampToQuantum(QuantumRange*X),q); + SetPixelGreen(image,ClampToQuantum(QuantumRange*Y),q); + SetPixelBlue(image,ClampToQuantum(QuantumRange*Z),q); q+=GetPixelChannels(image); } sync=SyncCacheViewAuthenticPixels(image_view,exception); @@ -1861,12 +1655,41 @@ static inline ssize_t RoundToYCC(const double value) static inline void ConvertCMYKToRGB(PixelInfo *pixel) { - pixel->red=((QuantumRange-(QuantumScale*pixel->red* - (QuantumRange-pixel->black)+pixel->black))); - pixel->green=((QuantumRange-(QuantumScale*pixel->green* - (QuantumRange-pixel->black)+pixel->black))); - pixel->blue=((QuantumRange-(QuantumScale*pixel->blue* - (QuantumRange-pixel->black)+pixel->black))); + pixel->red=((QuantumRange-(QuantumScale*pixel->red* + (QuantumRange-pixel->black)+pixel->black))); + pixel->green=((QuantumRange-(QuantumScale*pixel->green* + (QuantumRange-pixel->black)+pixel->black))); + pixel->blue=((QuantumRange-(QuantumScale*pixel->blue* + (QuantumRange-pixel->black)+pixel->black))); +} + +static void ConvertYPbPrToRGB(const double Y,const double Pb,const double Pr, + double *red,double *green,double *blue) +{ + /* + Convert YPbPr to RGB colorspace. + */ + assert(red != (double *) NULL); + assert(green != (double *) NULL); + assert(blue != (double *) NULL); + *red=0.99999999999914679361*Y-1.2188941887145875e-06*Pb+ + 1.4019995886561440468*Pr; + *green=0.99999975910502514331*Y-0.34413567816504303521*Pb- + 0.71413649331646789076*Pr; + *blue=1.00000124040004623180*Y+1.77200006607230409200*Pb+ + 2.1453384174593273e-06*Pr; +} + +static void ConvertYCbCrToRGB(const double Y,const double Cb, + const double Cr,double *red,double *green,double *blue) +{ + /* + Convert -YCbCr to RGB colorspace. + */ + assert(red != (double *) NULL); + assert(green != (double *) NULL); + assert(blue != (double *) NULL); + ConvertYPbPrToRGB(Y,Cb-0.5,Cr-0.5,red,green,blue); } static MagickBooleanType TransformsRGBImage(Image *image, @@ -2320,7 +2143,13 @@ static MagickBooleanType TransformsRGBImage(Image *image, return(MagickFalse); return(status); } + case HCLColorspace: + case HCLpColorspace: + case HSBColorspace: case HSIColorspace: + case HSLColorspace: + case HSVColorspace: + case HWBColorspace: { /* Transform image from source colorspace to sRGB. @@ -2382,11 +2211,31 @@ static MagickBooleanType TransformsRGBImage(Image *image, ConvertHCLpToRGB(X,Y,Z,&red,&green,&blue); break; } + case HSBColorspace: + { + ConvertHSBToRGB(X,Y,Z,&red,&green,&blue); + break; + } case HSIColorspace: { ConvertHSIToRGB(X,Y,Z,&red,&green,&blue); break; } + case HSLColorspace: + { + ConvertHSLToRGB(X,Y,Z,&red,&green,&blue); + break; + } + case HSVColorspace: + { + ConvertHSVToRGB(X,Y,Z,&red,&green,&blue); + break; + } + case HWBColorspace: + { + ConvertHWBToRGB(X,Y,Z,&red,&green,&blue); + break; + } default: break; } @@ -2404,266 +2253,6 @@ static MagickBooleanType TransformsRGBImage(Image *image, return(MagickFalse); return(status); } - case HSBColorspace: - { - /* - Transform image from HSB to sRGB. - */ - if (image->storage_class == PseudoClass) - { - if (SyncImage(image,exception) == MagickFalse) - return(MagickFalse); - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); - } - image_view=AcquireAuthenticCacheView(image,exception); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(status) \ - magick_threads(image,image,image->rows,1) -#endif - for (y=0; y < (ssize_t) image->rows; y++) - { - MagickBooleanType - sync; - - register ssize_t - x; - - register Quantum - *restrict q; - - if (status == MagickFalse) - continue; - q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, - exception); - if (q == (Quantum *) NULL) - { - status=MagickFalse; - continue; - } - for (x=0; x < (ssize_t) image->columns; x++) - { - double - blue, - brightness, - green, - hue, - red, - saturation; - - hue=(double) (QuantumScale*GetPixelRed(image,q)); - saturation=(double) (QuantumScale*GetPixelGreen(image,q)); - brightness=(double) (QuantumScale*GetPixelBlue(image,q)); - ConvertHSBToRGB(hue,saturation,brightness,&red,&green,&blue); - SetPixelRed(image,ClampToQuantum(red),q); - SetPixelGreen(image,ClampToQuantum(green),q); - SetPixelBlue(image,ClampToQuantum(blue),q); - q+=GetPixelChannels(image); - } - sync=SyncCacheViewAuthenticPixels(image_view,exception); - if (sync == MagickFalse) - status=MagickFalse; - } - image_view=DestroyCacheView(image_view); - if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse) - return(MagickFalse); - return(status); - } - case HSLColorspace: - { - /* - Transform image from HSL to sRGB. - */ - if (image->storage_class == PseudoClass) - { - if (SyncImage(image,exception) == MagickFalse) - return(MagickFalse); - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); - } - image_view=AcquireAuthenticCacheView(image,exception); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(status) \ - magick_threads(image,image,image->rows,1) -#endif - for (y=0; y < (ssize_t) image->rows; y++) - { - MagickBooleanType - sync; - - register ssize_t - x; - - register Quantum - *restrict q; - - if (status == MagickFalse) - continue; - q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, - exception); - if (q == (Quantum *) NULL) - { - status=MagickFalse; - continue; - } - for (x=0; x < (ssize_t) image->columns; x++) - { - double - blue, - green, - hue, - lightness, - red, - saturation; - - hue=(double) (QuantumScale*GetPixelRed(image,q)); - saturation=(double) (QuantumScale*GetPixelGreen(image,q)); - lightness=(double) (QuantumScale*GetPixelBlue(image,q)); - ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue); - SetPixelRed(image,ClampToQuantum(red),q); - SetPixelGreen(image,ClampToQuantum(green),q); - SetPixelBlue(image,ClampToQuantum(blue),q); - q+=GetPixelChannels(image); - } - sync=SyncCacheViewAuthenticPixels(image_view,exception); - if (sync == MagickFalse) - status=MagickFalse; - } - image_view=DestroyCacheView(image_view); - if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse) - return(MagickFalse); - return(status); - } - case HSVColorspace: - { - /* - Transform image from HSV to sRGB. - */ - if (image->storage_class == PseudoClass) - { - if (SyncImage(image,exception) == MagickFalse) - return(MagickFalse); - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); - } - image_view=AcquireAuthenticCacheView(image,exception); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(status) \ - magick_threads(image,image,image->rows,1) -#endif - for (y=0; y < (ssize_t) image->rows; y++) - { - MagickBooleanType - sync; - - register ssize_t - x; - - register Quantum - *restrict q; - - if (status == MagickFalse) - continue; - q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, - exception); - if (q == (Quantum *) NULL) - { - status=MagickFalse; - continue; - } - for (x=0; x < (ssize_t) image->columns; x++) - { - double - blue, - green, - hue, - red, - saturation, - value; - - hue=(double) (QuantumScale*GetPixelRed(image,q)); - saturation=(double) (QuantumScale*GetPixelGreen(image,q)); - value=(double) (QuantumScale*GetPixelBlue(image,q)); - ConvertHSVToRGB(hue,saturation,value,&red,&green,&blue); - SetPixelRed(image,ClampToQuantum(red),q); - SetPixelGreen(image,ClampToQuantum(green),q); - SetPixelBlue(image,ClampToQuantum(blue),q); - q+=GetPixelChannels(image); - } - sync=SyncCacheViewAuthenticPixels(image_view,exception); - if (sync == MagickFalse) - status=MagickFalse; - } - image_view=DestroyCacheView(image_view); - if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse) - return(MagickFalse); - return(status); - } - case HWBColorspace: - { - /* - Transform image from HWB to sRGB. - */ - if (image->storage_class == PseudoClass) - { - if (SyncImage(image,exception) == MagickFalse) - return(MagickFalse); - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); - } - image_view=AcquireAuthenticCacheView(image,exception); -#if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(status) \ - magick_threads(image,image,image->rows,1) -#endif - for (y=0; y < (ssize_t) image->rows; y++) - { - MagickBooleanType - sync; - - register ssize_t - x; - - register Quantum - *restrict q; - - if (status == MagickFalse) - continue; - q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1, - exception); - if (q == (Quantum *) NULL) - { - status=MagickFalse; - continue; - } - for (x=0; x < (ssize_t) image->columns; x++) - { - double - blackness, - blue, - green, - hue, - red, - whiteness; - - hue=(double) (QuantumScale*GetPixelRed(image,q)); - whiteness=(double) (QuantumScale*GetPixelGreen(image,q)); - blackness=(double) (QuantumScale*GetPixelBlue(image,q)); - ConvertHWBToRGB(hue,whiteness,blackness,&red,&green,&blue); - SetPixelRed(image,ClampToQuantum(red),q); - SetPixelGreen(image,ClampToQuantum(green),q); - SetPixelBlue(image,ClampToQuantum(blue),q); - q+=GetPixelChannels(image); - } - sync=SyncCacheViewAuthenticPixels(image_view,exception); - if (sync == MagickFalse) - status=MagickFalse; - } - image_view=DestroyCacheView(image_view); - if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse) - return(MagickFalse); - return(status); - } case LabColorspace: { /*