]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Sat, 4 May 2013 22:26:12 +0000 (22:26 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Sat, 4 May 2013 22:26:12 +0000 (22:26 +0000)
MagickCore/colorspace.c

index 432bf7f8f5d061e551f5ba490a70743ec43464c1..d7ed15b17b5ebafb232807e57bc268a8e0c7f72b 100644 (file)
@@ -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:
     {
       /*