From 53dc799d1d991881bebd525680ff75629ac24703 Mon Sep 17 00:00:00 2001
From: cristy <urban-warrior@git.imagemagick.org>
Date: Wed, 13 Mar 2013 17:33:33 +0000
Subject: [PATCH]

---
 MagickCore/colorspace.c | 123 ++++++++++++++++------------------------
 1 file changed, 49 insertions(+), 74 deletions(-)

diff --git a/MagickCore/colorspace.c b/MagickCore/colorspace.c
index a50086c73..4aa5996b8 100644
--- a/MagickCore/colorspace.c
+++ b/MagickCore/colorspace.c
@@ -382,7 +382,6 @@ static MagickBooleanType sRGBTransformImage(Image *image,
       return(status);
     }
     case GRAYColorspace:
-    case Rec601LumaColorspace:
     {
       /*
         Transform image from sRGB to GRAY.
@@ -421,17 +420,7 @@ static MagickBooleanType sRGBTransformImage(Image *image,
           }
         for (x=0; x < (ssize_t) image->columns; x++)
         {
-          double
-            blue,
-            gray,
-            green,
-            red;
-
-          red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q));
-          green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q));
-          blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q));
-          gray=0.298839f*red+0.586811f*green+0.114350f*blue;
-          SetPixelGray(image,ClampToQuantum(gray),q);
+          SetPixelGray(image,ClampToQuantum(GetPixelIntensity(image,q)),q);
           q+=GetPixelChannels(image);
         }
         sync=SyncCacheViewAuthenticPixels(image_view,exception);
@@ -1095,68 +1084,6 @@ static MagickBooleanType sRGBTransformImage(Image *image,
         return(MagickFalse);
       return(status);
     }
-    case Rec709LumaColorspace:
-    {
-      /*
-        Transform image from sRGB to Rec709Luma.
-      */
-      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,
-            gray,
-            green,
-            red;
-
-          red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q));
-          green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q));
-          blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q));
-          gray=0.212600f*red+0.715200f*green+0.072200f*blue;
-          SetPixelGray(image,ClampToQuantum(gray),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);
-      image->type=GrayscaleType;
-      return(status);
-    }
     case RGBColorspace:
     {
       /*
@@ -1335,6 +1262,30 @@ static MagickBooleanType sRGBTransformImage(Image *image,
       }
       break;
     }
+    case Rec601LumaColorspace:
+    {
+      /*
+        Initialize Rec601 luma tables:
+
+          G = 0.298839*R+0.586811*G+0.114350*B
+      */
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+      #pragma omp parallel for schedule(static,4)
+#endif
+      for (i=0; i <= (ssize_t) MaxMap; i++)
+      {
+        x_map[i].x=(MagickRealType) (0.298839f*(float) i);
+        y_map[i].x=(MagickRealType) (0.586811f*(float) i);
+        z_map[i].x=(MagickRealType) (0.114350f*(float) i);
+        x_map[i].y=(MagickRealType) (0.298839f*(float) i);
+        y_map[i].y=(MagickRealType) (0.586811f*(float) i);
+        z_map[i].y=(MagickRealType) (0.114350f*(float) i);
+        x_map[i].z=(MagickRealType) (0.298839f*(float) i);
+        y_map[i].z=(MagickRealType) (0.586811f*(float) i);
+        z_map[i].z=(MagickRealType) (0.114350f*(float) i);
+      }
+      break;
+    }
     case Rec601YCbCrColorspace:
     case YCbCrColorspace:
     {
@@ -1368,6 +1319,30 @@ static MagickBooleanType sRGBTransformImage(Image *image,
       }
       break;
     }
+    case Rec709LumaColorspace:
+    {
+      /*
+        Initialize Rec709 luma tables:
+
+          G = 0.21260*R+0.71520*G+0.07220*B
+      */
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+      #pragma omp parallel for schedule(static,4)
+#endif
+      for (i=0; i <= (ssize_t) MaxMap; i++)
+      {
+        x_map[i].x=(MagickRealType) (0.21260f*(float) i);
+        y_map[i].x=(MagickRealType) (0.71520f*(float) i);
+        z_map[i].x=(MagickRealType) (0.07220f*(float) i);
+        x_map[i].y=(MagickRealType) (0.21260f*(float) i);
+        y_map[i].y=(MagickRealType) (0.71520f*(float) i);
+        z_map[i].y=(MagickRealType) (0.07220f*(float) i);
+        x_map[i].z=(MagickRealType) (0.21260f*(float) i);
+        y_map[i].z=(MagickRealType) (0.71520f*(float) i);
+        z_map[i].z=(MagickRealType) (0.07220f*(float) i);
+      }
+      break;
+    }
     case Rec709YCbCrColorspace:
     {
       /*
-- 
2.40.0