*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)
{
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.
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;
}
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)
{
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);
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)
{
{
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);
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)
{
{
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);
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)
{
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);
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) \
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);
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)
{
{
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);
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)
{
{
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);
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)
{
double
blue,
green,
- L,
- M,
red,
- S,
X,
Y,
Z;
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);
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,
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.
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;
}
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:
{
/*