]> granicus.if.org Git - imagemagick/blobdiff - magick/attribute.c
(no commit message)
[imagemagick] / magick / attribute.c
index 723bfc327e528eca3bff21554184ab69943ef416..8378d460c365704551cb3826c065595c8ea2198d 100644 (file)
@@ -17,7 +17,7 @@
 %                                October 2002                                 %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
 MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
   ExceptionInfo *exception)
 {
-  long
-    y;
+  CacheView
+    *image_view;
 
   MagickBooleanType
     status;
@@ -136,8 +136,8 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
   register const PixelPacket
     *p;
 
-  CacheView
-    *image_view;
+  ssize_t
+    y;
 
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
@@ -145,8 +145,8 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   bounds.width=0;
   bounds.height=0;
-  bounds.x=(long) image->columns;
-  bounds.y=(long) image->rows;
+  bounds.x=(ssize_t) image->columns;
+  bounds.y=(ssize_t) image->rows;
   GetMagickPixelPacket(image,&target[0]);
   image_view=AcquireCacheView(image);
   p=GetCacheViewVirtualPixels(image_view,0,0,1,1,exception);
@@ -158,20 +158,21 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
   SetMagickPixelPacket(image,p,GetCacheViewAuthenticIndexQueue(image_view),
     &target[0]);
   GetMagickPixelPacket(image,&target[1]);
-  p=GetCacheViewVirtualPixels(image_view,(long) image->columns-1,0,1,1,
+  p=GetCacheViewVirtualPixels(image_view,(ssize_t) image->columns-1,0,1,1,
     exception);
   SetMagickPixelPacket(image,p,GetCacheViewAuthenticIndexQueue(image_view),
     &target[1]);
   GetMagickPixelPacket(image,&target[2]);
-  p=GetCacheViewVirtualPixels(image_view,0,(long) image->rows-1,1,1,exception);
+  p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) image->rows-1,1,1,
+    exception);
   SetMagickPixelPacket(image,p,GetCacheViewAuthenticIndexQueue(image_view),
     &target[2]);
   status=MagickTrue;
   GetMagickPixelPacket(image,&zero);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP >= 200203)
-  #pragma omp parallel for shared(status)
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+  #pragma omp parallel for schedule(dynamic,4) shared(status)
 #endif
-  for (y=0; y < (long) image->rows; y++)
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
     MagickPixelPacket
       pixel;
@@ -180,17 +181,17 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
       bounding_box;
 
     register const IndexPacket
-      *__restrict indexes;
+      *restrict indexes;
 
     register const PixelPacket
-      *__restrict p;
+      *restrict p;
 
-    register long
+    register ssize_t
       x;
 
     if (status == MagickFalse)
       continue;
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP >= 200203)
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
 #  pragma omp critical (MagickCore_GetImageBoundingBox)
 #endif
     bounding_box=bounds;
@@ -202,24 +203,24 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
       }
     indexes=GetCacheViewVirtualIndexQueue(image_view);
     pixel=zero;
-    for (x=0; x < (long) image->columns; x++)
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
       SetMagickPixelPacket(image,p,indexes+x,&pixel);
       if ((x < bounding_box.x) &&
           (IsMagickColorSimilar(&pixel,&target[0]) == MagickFalse))
         bounding_box.x=x;
-      if ((x > (long) bounding_box.width) &&
+      if ((x > (ssize_t) bounding_box.width) &&
           (IsMagickColorSimilar(&pixel,&target[1]) == MagickFalse))
-        bounding_box.width=(unsigned long) x;
+        bounding_box.width=(size_t) x;
       if ((y < bounding_box.y) &&
           (IsMagickColorSimilar(&pixel,&target[0]) == MagickFalse))
         bounding_box.y=y;
-      if ((y > (long) bounding_box.height) &&
+      if ((y > (ssize_t) bounding_box.height) &&
           (IsMagickColorSimilar(&pixel,&target[2]) == MagickFalse))
-        bounding_box.height=(unsigned long) y;
+        bounding_box.height=(size_t) y;
       p++;
     }
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP >= 200203)
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
 #  pragma omp critical (MagickCore_GetImageBoundingBox)
 #endif
     {
@@ -260,8 +261,8 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
 %
 %  The format of the GetImageChannelDepth method is:
 %
-%      unsigned long GetImageDepth(const Image *image,ExceptionInfo *exception)
-%      unsigned long GetImageChannelDepth(const Image *image,
+%      size_t GetImageDepth(const Image *image,ExceptionInfo *exception)
+%      size_t GetImageChannelDepth(const Image *image,
 %        const ChannelType channel,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
@@ -273,32 +274,30 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-MagickExport unsigned long GetImageDepth(const Image *image,
-  ExceptionInfo *exception)
+MagickExport size_t GetImageDepth(const Image *image,ExceptionInfo *exception)
 {
-  return(GetImageChannelDepth(image,AllChannels,exception));
+  return(GetImageChannelDepth(image,CompositeChannels,exception));
 }
 
-MagickExport unsigned long GetImageChannelDepth(const Image *image,
+MagickExport size_t GetImageChannelDepth(const Image *image,
   const ChannelType channel,ExceptionInfo *exception)
 {
-  long
-    y;
+  CacheView
+    *image_view;
 
   MagickBooleanType
     status;
 
-  register long
+  register ssize_t
     id;
 
-  unsigned long
+  size_t
     *current_depth,
     depth,
     number_threads;
 
-  CacheView
-    *image_view;
+  ssize_t
+    y;
 
   /*
     Compute image depth.
@@ -308,30 +307,32 @@ MagickExport unsigned long GetImageChannelDepth(const Image *image,
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   number_threads=GetOpenMPMaximumThreads();
-  current_depth=(unsigned long *) AcquireQuantumMemory(number_threads,
+  current_depth=(size_t *) AcquireQuantumMemory(number_threads,
     sizeof(*current_depth));
-  if (current_depth == (unsigned long *) NULL)
+  if (current_depth == (size_t *) NULL)
     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
   status=MagickTrue;
-  for (id=0; id < (long) number_threads; id++)
+  for (id=0; id < (ssize_t) number_threads; id++)
     current_depth[id]=1;
   if ((image->storage_class == PseudoClass) && (image->matte == MagickFalse))
     {
       register const PixelPacket
-        *__restrict p;
+        *restrict p;
 
-      register long
+      register ssize_t
         i;
 
       p=image->colormap;
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP >= 200203)
-  #pragma omp parallel for shared(status)
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+  #pragma omp parallel for schedule(dynamic,4) shared(status)
 #endif
-      for (i=0; i < (long) image->colors; i++)
+      for (i=0; i < (ssize_t) image->colors; i++)
       {
+        const int
+          id = GetOpenMPThreadId();
+
         if (status == MagickFalse)
           continue;
-        id=GetOpenMPThreadId();
         while (current_depth[id] < MAGICKCORE_QUANTUM_DEPTH)
         {
           MagickStatusType
@@ -343,13 +344,13 @@ MagickExport unsigned long GetImageChannelDepth(const Image *image,
           status=0;
           range=GetQuantumRange(current_depth[id]);
           if ((channel & RedChannel) != 0)
-            status|=p->red != ScaleAnyToQuantum(ScaleQuantumToAny(p->red,
+            status|=GetRedPixelComponent(p) != ScaleAnyToQuantum(ScaleQuantumToAny(GetRedPixelComponent(p),
               range),range);
           if ((channel & GreenChannel) != 0)
-            status|=p->green != ScaleAnyToQuantum(ScaleQuantumToAny(p->green,
+            status|=GetGreenPixelComponent(p) != ScaleAnyToQuantum(ScaleQuantumToAny(GetGreenPixelComponent(p),
               range),range);
           if ((channel & BlueChannel) != 0)
-            status|=p->blue != ScaleAnyToQuantum(ScaleQuantumToAny(p->blue,
+            status|=GetBluePixelComponent(p) != ScaleAnyToQuantum(ScaleQuantumToAny(GetBluePixelComponent(p),
               range),range);
           if (status == 0)
             break;
@@ -358,36 +359,37 @@ MagickExport unsigned long GetImageChannelDepth(const Image *image,
         p++;
       }
       depth=current_depth[0];
-      for (id=1; id < (long) number_threads; id++)
+      for (id=1; id < (ssize_t) number_threads; id++)
         if (depth < current_depth[id])
           depth=current_depth[id];
-      current_depth=(unsigned long *) RelinquishMagickMemory(current_depth);
+      current_depth=(size_t *) RelinquishMagickMemory(current_depth);
       return(depth);
     }
   image_view=AcquireCacheView(image);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP >= 200203)
-  #pragma omp parallel for shared(status)
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+  #pragma omp parallel for schedule(dynamic,4) shared(status)
 #endif
-  for (y=0; y < (long) image->rows; y++)
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
+    const int
+      id = GetOpenMPThreadId();
+
     register const IndexPacket
-      *__restrict indexes;
+      *restrict indexes;
 
     register const PixelPacket
-      *__restrict p;
+      *restrict p;
 
-    register long
-      id,
+    register ssize_t
       x;
 
     if (status == MagickFalse)
       continue;
-    id=GetOpenMPThreadId();
     p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
     if (p == (const PixelPacket *) NULL)
       continue;
     indexes=GetCacheViewVirtualIndexQueue(image_view);
-    for (x=0; x < (long) image->columns; x++)
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
       while (current_depth[id] < MAGICKCORE_QUANTUM_DEPTH)
       {
@@ -400,21 +402,22 @@ MagickExport unsigned long GetImageChannelDepth(const Image *image,
         status=0;
         range=GetQuantumRange(current_depth[id]);
         if ((channel & RedChannel) != 0)
-          status|=p->red != ScaleAnyToQuantum(ScaleQuantumToAny(p->red,range),
-            range);
+          status|=GetRedPixelComponent(p) != ScaleAnyToQuantum(
+            ScaleQuantumToAny(GetRedPixelComponent(p),range),range);
         if ((channel & GreenChannel) != 0)
-          status|=p->green != ScaleAnyToQuantum(ScaleQuantumToAny(p->green,
-            range),range);
+          status|=GetGreenPixelComponent(p) != ScaleAnyToQuantum(
+            ScaleQuantumToAny(GetGreenPixelComponent(p),range),range);
         if ((channel & BlueChannel) != 0)
-          status|=p->blue != ScaleAnyToQuantum(ScaleQuantumToAny(p->blue,range),
-            range);
+          status|=GetBluePixelComponent(p) != ScaleAnyToQuantum(
+            ScaleQuantumToAny(GetBluePixelComponent(p),range),range);
         if (((channel & OpacityChannel) != 0) && (image->matte != MagickFalse))
-          status|=p->opacity != ScaleAnyToQuantum(ScaleQuantumToAny(p->opacity,
-            range),range);
+          status|=GetOpacityPixelComponent(p) != ScaleAnyToQuantum(
+            ScaleQuantumToAny(GetOpacityPixelComponent(p),range),range);
         if (((channel & IndexChannel) != 0) &&
             (image->colorspace == CMYKColorspace))
-          status|=indexes[x] != ScaleAnyToQuantum(ScaleQuantumToAny(indexes[x],
-            range),range);
+          status|=GetIndexPixelComponent(indexes+x) !=
+            ScaleAnyToQuantum(ScaleQuantumToAny(GetIndexPixelComponent(indexes+
+            x),range),range);
         if (status == 0)
           break;
         current_depth[id]++;
@@ -426,10 +429,10 @@ MagickExport unsigned long GetImageChannelDepth(const Image *image,
   }
   image_view=DestroyCacheView(image_view);
   depth=current_depth[0];
-  for (id=1; id < (long) number_threads; id++)
+  for (id=1; id < (ssize_t) number_threads; id++)
     if (depth < current_depth[id])
       depth=current_depth[id];
-  current_depth=(unsigned long *) RelinquishMagickMemory(current_depth);
+  current_depth=(size_t *) RelinquishMagickMemory(current_depth);
   return(depth);
 }
 \f
@@ -449,7 +452,7 @@ MagickExport unsigned long GetImageChannelDepth(const Image *image,
 %
 %  The format of the GetImageQuantumDepth method is:
 %
-%      unsigned long GetImageQuantumDepth(const Image *image,
+%      size_t GetImageQuantumDepth(const Image *image,
 %        const MagickBooleanType constrain)
 %
 %  A description of each parameter follows:
@@ -468,10 +471,10 @@ static inline double MagickMin(const double x,const double y)
   return(y);
 }
 
-MagickExport unsigned long GetImageQuantumDepth(const Image *image,
+MagickExport size_t GetImageQuantumDepth(const Image *image,
   const MagickBooleanType constrain)
 {
-  unsigned long
+  size_t
     depth;
 
   depth=image->depth;
@@ -487,7 +490,7 @@ MagickExport unsigned long GetImageQuantumDepth(const Image *image,
         if (depth <= 64)
           depth=64;
   if (constrain != MagickFalse)
-    depth=(unsigned long) MagickMin((double) depth,(double)
+    depth=(size_t) MagickMin((double) depth,(double)
       MAGICKCORE_QUANTUM_DEPTH);
   return(depth);
 }
@@ -584,12 +587,21 @@ MagickExport ImageType GetImageType(const Image *image,ExceptionInfo *exception)
 MagickExport MagickBooleanType IsGrayImage(const Image *image,
   ExceptionInfo *exception)
 {
+  CacheView
+    *image_view;
+
   ImageType
     type;
 
   register const PixelPacket
     *p;
 
+  register ssize_t
+    x;
+
+  ssize_t
+    y;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
@@ -600,63 +612,27 @@ MagickExport MagickBooleanType IsGrayImage(const Image *image,
   if (image->colorspace == CMYKColorspace)
     return(MagickFalse);
   type=BilevelType;
-  switch (image->storage_class)
+  image_view=AcquireCacheView(image);
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
-    case DirectClass:
-    case UndefinedClass:
+    p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
+    if (p == (const PixelPacket *) NULL)
+      break;
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
-      long
-        y;
-
-      register long
-        x;
-
-      CacheView
-        *image_view;
-
-      image_view=AcquireCacheView(image);
-      for (y=0; y < (long) image->rows; y++)
-      {
-        p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
-        if (p == (const PixelPacket *) NULL)
-          break;
-        for (x=0; x < (long) image->columns; x++)
+      if (IsGrayPixel(p) == MagickFalse)
         {
-          if (IsGrayPixel(p) == MagickFalse)
-            {
-              type=UndefinedType;
-              break;
-            }
-          if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
-            type=GrayscaleType;
-          p++;
-        }
-        if (type == UndefinedType)
+          type=UndefinedType;
           break;
-      }
-      image_view=DestroyCacheView(image_view);
-      break;
+        }
+      if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
+        type=GrayscaleType;
+      p++;
     }
-    case PseudoClass:
-    {
-      register long
-        i;
-
-      p=image->colormap;
-      for (i=0; i < (long) image->colors; i++)
-      {
-        if (IsGrayPixel(p) == MagickFalse)
-          {
-            type=UndefinedType;
-            break;
-          }
-        if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
-          type=GrayscaleType;
-        p++;
-      }
+    if (type == UndefinedType)
       break;
-    }
   }
+  image_view=DestroyCacheView(image_view);
   if (type == UndefinedType)
     return(MagickFalse);
   ((Image *) image)->type=type;
@@ -695,12 +671,21 @@ MagickExport MagickBooleanType IsGrayImage(const Image *image,
 MagickExport MagickBooleanType IsMonochromeImage(const Image *image,
   ExceptionInfo *exception)
 {
+  CacheView
+    *image_view;
+
   ImageType
     type;
 
+  register ssize_t
+    x;
+
   register const PixelPacket
     *p;
 
+  ssize_t
+    y;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
@@ -710,61 +695,25 @@ MagickExport MagickBooleanType IsMonochromeImage(const Image *image,
   if (image->colorspace == CMYKColorspace)
     return(MagickFalse);
   type=BilevelType;
-  switch (image->storage_class)
+  image_view=AcquireCacheView(image);
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
-    case DirectClass:
-    case UndefinedClass:
+    p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
+    if (p == (const PixelPacket *) NULL)
+      break;
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
-      long
-        y;
-
-      register long
-        x;
-
-      CacheView
-        *image_view;
-
-      image_view=AcquireCacheView(image);
-      for (y=0; y < (long) image->rows; y++)
-      {
-        p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
-        if (p == (const PixelPacket *) NULL)
-          break;
-        for (x=0; x < (long) image->columns; x++)
+      if (IsMonochromePixel(p) == MagickFalse)
         {
-          if (IsMonochromePixel(p) == MagickFalse)
-            {
-              type=UndefinedType;
-              break;
-            }
-          p++;
-        }
-        if (type == UndefinedType)
+          type=UndefinedType;
           break;
-      }
-      image_view=DestroyCacheView(image_view);
-      if (y == (long) image->rows)
-        ((Image *) image)->type=BilevelType;
-      break;
+        }
+      p++;
     }
-    case PseudoClass:
-    {
-      register long
-        i;
-
-      p=image->colormap;
-      for (i=0; i < (long) image->colors; i++)
-      {
-        if (IsMonochromePixel(p) == MagickFalse)
-          {
-            type=UndefinedType;
-            break;
-          }
-        p++;
-      }
+    if (type == UndefinedType)
       break;
-    }
   }
+  image_view=DestroyCacheView(image_view);
   if (type == UndefinedType)
     return(MagickFalse);
   ((Image *) image)->type=type;
@@ -800,17 +749,17 @@ MagickExport MagickBooleanType IsMonochromeImage(const Image *image,
 MagickExport MagickBooleanType IsOpaqueImage(const Image *image,
   ExceptionInfo *exception)
 {
-  long
-    y;
+  CacheView
+    *image_view;
 
   register const PixelPacket
     *p;
 
-  register long
+  register ssize_t
     x;
 
-  CacheView
-    *image_view;
+  ssize_t
+    y;
 
   /*
     Determine if image is opaque.
@@ -822,22 +771,22 @@ MagickExport MagickBooleanType IsOpaqueImage(const Image *image,
   if (image->matte == MagickFalse)
     return(MagickTrue);
   image_view=AcquireCacheView(image);
-  for (y=0; y < (long) image->rows; y++)
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
     p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
     if (p == (const PixelPacket *) NULL)
       break;
-    for (x=0; x < (long) image->columns; x++)
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
-      if (p->opacity != OpaqueOpacity)
+      if (GetOpacityPixelComponent(p) != OpaqueOpacity)
         break;
       p++;
     }
-    if (x < (long) image->columns)
+    if (x < (ssize_t) image->columns)
      break;
   }
   image_view=DestroyCacheView(image_view);
-  return(y < (long) image->rows ? MagickFalse : MagickTrue);
+  return(y < (ssize_t) image->rows ? MagickFalse : MagickTrue);
 }
 \f
 /*
@@ -855,9 +804,9 @@ MagickExport MagickBooleanType IsOpaqueImage(const Image *image,
 %
 %  The format of the SetImageChannelDepth method is:
 %
-%      MagickBooleanType SetImageDepth(Image *image,const unsigned long depth)
+%      MagickBooleanType SetImageDepth(Image *image,const size_t depth)
 %      MagickBooleanType SetImageChannelDepth(Image *image,
-%        const ChannelType channel,const unsigned long depth)
+%        const ChannelType channel,const size_t depth)
 %
 %  A description of each parameter follows:
 %
@@ -868,36 +817,35 @@ MagickExport MagickBooleanType IsOpaqueImage(const Image *image,
 %    o depth: the image depth.
 %
 */
-
 MagickExport MagickBooleanType SetImageDepth(Image *image,
-  const unsigned long depth)
+  const size_t depth)
 {
-  return(SetImageChannelDepth(image,AllChannels,depth));
+  return(SetImageChannelDepth(image,CompositeChannels,depth));
 }
 
 MagickExport MagickBooleanType SetImageChannelDepth(Image *image,
-  const ChannelType channel,const unsigned long depth)
+  const ChannelType channel,const size_t depth)
 {
+  CacheView
+    *image_view;
+
   ExceptionInfo
     *exception;
 
-  long
-    y;
-
   MagickBooleanType
     status;
 
   QuantumAny
     range;
 
-  CacheView
-    *image_view;
+  ssize_t
+    y;
 
   assert(image != (Image *) NULL);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   assert(image->signature == MagickSignature);
-  if (GetImageDepth(image,&image->exception) <= (unsigned long)
+  if (GetImageDepth(image,&image->exception) <= (size_t)
       MagickMin((double) depth,(double) MAGICKCORE_QUANTUM_DEPTH))
     {
       image->depth=depth;
@@ -910,19 +858,19 @@ MagickExport MagickBooleanType SetImageChannelDepth(Image *image,
   range=GetQuantumRange(depth);
   exception=(&image->exception);
   image_view=AcquireCacheView(image);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP >= 200203)
-  #pragma omp parallel for shared(status)
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+  #pragma omp parallel for schedule(dynamic,4) shared(status)
 #endif
-  for (y=0; y < (long) image->rows; y++)
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
     register IndexPacket
-      *__restrict indexes;
+      *restrict indexes;
 
-    register long
+    register ssize_t
       x;
 
     register PixelPacket
-      *__restrict q;
+      *restrict q;
 
     if (status == MagickFalse)
       continue;
@@ -934,19 +882,24 @@ MagickExport MagickBooleanType SetImageChannelDepth(Image *image,
         continue;
       }
     indexes=GetCacheViewAuthenticIndexQueue(image_view);
-    for (x=0; x < (long) image->columns; x++)
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
       if ((channel & RedChannel) != 0)
-        q->red=ScaleAnyToQuantum(ScaleQuantumToAny(q->red,range),range);
+        SetRedPixelComponent(q,ScaleAnyToQuantum(ScaleQuantumToAny(
+          GetRedPixelComponent(q),range),range));
       if ((channel & GreenChannel) != 0)
-        q->green=ScaleAnyToQuantum(ScaleQuantumToAny(q->green,range),range);
+        SetGreenPixelComponent(q,ScaleAnyToQuantum(ScaleQuantumToAny(
+          GetGreenPixelComponent(q),range),range));
       if ((channel & BlueChannel) != 0)
-        q->blue=ScaleAnyToQuantum(ScaleQuantumToAny(q->blue,range),range);
+        SetBluePixelComponent(q,ScaleAnyToQuantum(ScaleQuantumToAny(
+          GetBluePixelComponent(q),range),range));
       if (((channel & OpacityChannel) != 0) && (image->matte != MagickFalse))
-        q->opacity=ScaleAnyToQuantum(ScaleQuantumToAny(q->opacity,range),range);
+        SetOpacityPixelComponent(q,ScaleAnyToQuantum(ScaleQuantumToAny(
+          GetOpacityPixelComponent(q),range),range));
       if (((channel & IndexChannel) != 0) &&
           (image->colorspace == CMYKColorspace))
-        indexes[x]=ScaleAnyToQuantum(ScaleQuantumToAny(indexes[x],range),range);
+        SetIndexPixelComponent(indexes+x,ScaleAnyToQuantum(ScaleQuantumToAny(
+          GetIndexPixelComponent(indexes+x),range),range));
       q++;
     }
     if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
@@ -958,30 +911,26 @@ MagickExport MagickBooleanType SetImageChannelDepth(Image *image,
   image_view=DestroyCacheView(image_view);
   if (image->storage_class == PseudoClass)
     {
-      QuantumAny
-        range;
-
-      register long
+      register ssize_t
         i;
 
       register PixelPacket
-        *__restrict p;
+        *restrict p;
 
       p=image->colormap;
-      range=GetQuantumRange(depth);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP >= 200203)
-  #pragma omp parallel for shared(status)
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+  #pragma omp parallel for schedule(dynamic,4) shared(status)
 #endif
-      for (i=0; i < (long) image->colors; i++)
+      for (i=0; i < (ssize_t) image->colors; i++)
       {
         if ((channel & RedChannel) != 0)
-          p->red=ScaleAnyToQuantum(ScaleQuantumToAny(p->red,range),range);
+          GetRedPixelComponent(p)=ScaleAnyToQuantum(ScaleQuantumToAny(GetRedPixelComponent(p),range),range);
         if ((channel & GreenChannel) != 0)
-          p->green=ScaleAnyToQuantum(ScaleQuantumToAny(p->green,range),range);
+          GetGreenPixelComponent(p)=ScaleAnyToQuantum(ScaleQuantumToAny(GetGreenPixelComponent(p),range),range);
         if ((channel & BlueChannel) != 0)
-          p->blue=ScaleAnyToQuantum(ScaleQuantumToAny(p->blue,range),range);
+          GetBluePixelComponent(p)=ScaleAnyToQuantum(ScaleQuantumToAny(GetBluePixelComponent(p),range),range);
         if ((channel & OpacityChannel) != 0)
-          p->opacity=ScaleAnyToQuantum(ScaleQuantumToAny(p->opacity,range),
+          GetOpacityPixelComponent(p)=ScaleAnyToQuantum(ScaleQuantumToAny(GetOpacityPixelComponent(p),range),
             range);
         p++;
       }