%
*/
+static inline void ConvertXYZToLMS(const double x,const double y,
+ const double z,double *L,double *M,double *S)
+{
+ double
+ l,
+ m,
+ s;
+
+ /*
+ Convert XYZ to LMS colorspace.
+ */
+ assert(L != (double *) NULL);
+ assert(M != (double *) NULL);
+ assert(S != (double *) NULL);
+ l=0.7328*x+0.4296*y-0.1624*z;
+ m=(-0.7036*x+1.6975*y+0.0415*z);
+ s=0.0030*x+0.0136*y+0.9834*z;
+ *L=QuantumRange*l;
+ *M=QuantumRange*m;
+ *S=QuantumRange*s;
+}
+
static inline void ConvertRGBToXYZ(const double red,const double green,
const double blue,double *X,double *Y,double *Z)
{
return(MagickFalse);
return(status);
}
+ case LMSColorspace:
+ {
+ /*
+ Transform image from sRGB to LMS.
+ */
+ 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) \
+ dynamic_number_threads(image,image->columns,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,
+ M,
+ red,
+ S,
+ X,
+ Y,
+ Z;
+
+ red=InversesRGBCompandor((double) GetPixelRed(image,q));
+ green=InversesRGBCompandor((double) GetPixelGreen(image,q));
+ blue=InversesRGBCompandor((double) 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)
%
*/
+static inline void ConvertLMSToXYZ(const double L,const double M,const double S,
+ double *X,double *Y,double *Z)
+{
+ double
+ l,
+ m,
+ s;
+
+ assert(X != (double *) NULL);
+ assert(Y != (double *) NULL);
+ assert(Z != (double *) NULL);
+ l=QuantumScale*L;
+ m=QuantumScale*M;
+ s=QuantumScale*S;
+ *X=1.096123820835514*l-0.278869000218287*m+0.182745179382773*s;
+ *Y=0.454369041975359*l+0.473533154307412*m+0.072097803717229*s;
+ *Z=(-0.009627608738429)*l-0.005698031216113*m+1.015325639954543*s;
+}
+
static inline void ConvertLabToXYZ(const double L,const double a,const double b,
double *X,double *Y,double *Z)
{
return(MagickFalse);
return(status);
}
+ case LMSColorspace:
+ {
+ /*
+ Transform image from LMS 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) \
+ dynamic_number_threads(image,image->columns,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,
+ M,
+ red,
+ S,
+ X,
+ Y,
+ Z;
+
+ L=QuantumScale*GetPixelRed(image,q);
+ M=QuantumScale*GetPixelGreen(image,q);
+ S=QuantumScale*GetPixelBlue(image,q);
+ ConvertLMSToXYZ(L,M,S,&X,&Y,&Z);
+ ConvertXYZToRGB(X,Y,Z,&red,&green,&blue);
+ SetPixelRed(image,ClampToQuantum(sRGBCompandor(red)),q);
+ SetPixelGreen(image,ClampToQuantum(sRGBCompandor(green)),q);
+ SetPixelBlue(image,ClampToQuantum(sRGBCompandor(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 LogColorspace:
{
const char