]> granicus.if.org Git - imagemagick/blobdiff - magick/attribute.c
(no commit message)
[imagemagick] / magick / attribute.c
index 2b40fc6de811454e3ae06be6e13d049d00412dab..8378d460c365704551cb3826c065595c8ea2198d 100644 (file)
@@ -17,7 +17,7 @@
 %                                October 2002                                 %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2010 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  %
@@ -123,9 +123,6 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
   CacheView
     *image_view;
 
-  ssize_t
-    y;
-
   MagickBooleanType
     status;
 
@@ -139,6 +136,9 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
   register const PixelPacket
     *p;
 
+  ssize_t
+    y;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
@@ -163,7 +163,8 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
   SetMagickPixelPacket(image,p,GetCacheViewAuthenticIndexQueue(image_view),
     &target[1]);
   GetMagickPixelPacket(image,&target[2]);
-  p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) 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;
@@ -273,20 +274,9 @@ MagickExport RectangleInfo GetImageBoundingBox(const Image *image,
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-static inline QuantumAny GetPixelDepth(const Quantum pixel,
-  const QuantumAny scale)
-{
-#if !defined(MAGICKCORE_HDRI_SUPPORT)
-  return((QuantumAny) (scale*(pixel/scale)));
-#else
-  return((QuantumAny) (scale*(pixel/scale)+0.5));
-#endif
-}
-
 MagickExport size_t GetImageDepth(const Image *image,ExceptionInfo *exception)
 {
-  return(GetImageChannelDepth(image,AllChannels,exception));
+  return(GetImageChannelDepth(image,CompositeChannels,exception));
 }
 
 MagickExport size_t GetImageChannelDepth(const Image *image,
@@ -295,9 +285,6 @@ MagickExport size_t GetImageChannelDepth(const Image *image,
   CacheView
     *image_view;
 
-  ssize_t
-    y;
-
   MagickBooleanType
     status;
 
@@ -309,6 +296,9 @@ MagickExport size_t GetImageChannelDepth(const Image *image,
     depth,
     number_threads;
 
+  ssize_t
+    y;
+
   /*
     Compute image depth.
   */
@@ -338,26 +328,30 @@ MagickExport size_t GetImageChannelDepth(const Image *image,
 #endif
       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
             status;
 
           QuantumAny
-            scale;
+            range;
 
           status=0;
-          scale=QuantumRange/((QuantumAny) QuantumRange >>
-            (MAGICKCORE_QUANTUM_DEPTH-current_depth[id]));
+          range=GetQuantumRange(current_depth[id]);
           if ((channel & RedChannel) != 0)
-            status|=(QuantumAny) p->red != GetPixelDepth(p->red,scale);
+            status|=GetRedPixelComponent(p) != ScaleAnyToQuantum(ScaleQuantumToAny(GetRedPixelComponent(p),
+              range),range);
           if ((channel & GreenChannel) != 0)
-            status|=(QuantumAny) p->green != GetPixelDepth(p->green,scale);
+            status|=GetGreenPixelComponent(p) != ScaleAnyToQuantum(ScaleQuantumToAny(GetGreenPixelComponent(p),
+              range),range);
           if ((channel & BlueChannel) != 0)
-            status|=(QuantumAny) p->blue != GetPixelDepth(p->blue,scale);
+            status|=GetBluePixelComponent(p) != ScaleAnyToQuantum(ScaleQuantumToAny(GetBluePixelComponent(p),
+              range),range);
           if (status == 0)
             break;
           current_depth[id]++;
@@ -377,6 +371,9 @@ MagickExport size_t GetImageChannelDepth(const Image *image,
 #endif
   for (y=0; y < (ssize_t) image->rows; y++)
   {
+    const int
+      id = GetOpenMPThreadId();
+
     register const IndexPacket
       *restrict indexes;
 
@@ -384,12 +381,10 @@ MagickExport size_t GetImageChannelDepth(const Image *image,
       *restrict p;
 
     register ssize_t
-      id,
       x;
 
     if (status == MagickFalse)
       continue;
-    id=GetOpenMPThreadId();
     p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
     if (p == (const PixelPacket *) NULL)
       continue;
@@ -402,22 +397,27 @@ MagickExport size_t GetImageChannelDepth(const Image *image,
           status;
 
         QuantumAny
-          scale;
+          range;
 
         status=0;
-        scale=QuantumRange/((QuantumAny) QuantumRange >>
-          (MAGICKCORE_QUANTUM_DEPTH-current_depth[id]));
+        range=GetQuantumRange(current_depth[id]);
         if ((channel & RedChannel) != 0)
-          status|=(QuantumAny) p->red != GetPixelDepth(p->red,scale);
+          status|=GetRedPixelComponent(p) != ScaleAnyToQuantum(
+            ScaleQuantumToAny(GetRedPixelComponent(p),range),range);
         if ((channel & GreenChannel) != 0)
-          status|=(QuantumAny) p->green != GetPixelDepth(p->green,scale);
+          status|=GetGreenPixelComponent(p) != ScaleAnyToQuantum(
+            ScaleQuantumToAny(GetGreenPixelComponent(p),range),range);
         if ((channel & BlueChannel) != 0)
-          status|=(QuantumAny) p->blue != GetPixelDepth(p->blue,scale);
+          status|=GetBluePixelComponent(p) != ScaleAnyToQuantum(
+            ScaleQuantumToAny(GetBluePixelComponent(p),range),range);
         if (((channel & OpacityChannel) != 0) && (image->matte != MagickFalse))
-          status|=(QuantumAny) p->opacity != GetPixelDepth(p->opacity,scale);
+          status|=GetOpacityPixelComponent(p) != ScaleAnyToQuantum(
+            ScaleQuantumToAny(GetOpacityPixelComponent(p),range),range);
         if (((channel & IndexChannel) != 0) &&
             (image->colorspace == CMYKColorspace))
-          status|=(QuantumAny) indexes[x] != GetPixelDepth(indexes[x],scale);
+          status|=GetIndexPixelComponent(indexes+x) !=
+            ScaleAnyToQuantum(ScaleQuantumToAny(GetIndexPixelComponent(indexes+
+            x),range),range);
         if (status == 0)
           break;
         current_depth[id]++;
@@ -593,15 +593,15 @@ MagickExport MagickBooleanType IsGrayImage(const Image *image,
   ImageType
     type;
 
-  ssize_t
-    y;
-
   register const PixelPacket
     *p;
 
   register ssize_t
     x;
 
+  ssize_t
+    y;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
@@ -677,15 +677,15 @@ MagickExport MagickBooleanType IsMonochromeImage(const Image *image,
   ImageType
     type;
 
-  ssize_t
-    y;
-
   register ssize_t
     x;
 
   register const PixelPacket
     *p;
 
+  ssize_t
+    y;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
@@ -752,15 +752,15 @@ MagickExport MagickBooleanType IsOpaqueImage(const Image *image,
   CacheView
     *image_view;
 
-  ssize_t
-    y;
-
   register const PixelPacket
     *p;
 
   register ssize_t
     x;
 
+  ssize_t
+    y;
+
   /*
     Determine if image is opaque.
   */
@@ -778,7 +778,7 @@ MagickExport MagickBooleanType IsOpaqueImage(const Image *image,
       break;
     for (x=0; x < (ssize_t) image->columns; x++)
     {
-      if (p->opacity != OpaqueOpacity)
+      if (GetOpacityPixelComponent(p) != OpaqueOpacity)
         break;
       p++;
     }
@@ -817,17 +817,10 @@ MagickExport MagickBooleanType IsOpaqueImage(const Image *image,
 %    o depth: the image depth.
 %
 */
-
-static inline Quantum SetPixelDepth(const Quantum pixel,
-  const QuantumAny scale)
-{
-  return((Quantum) (scale*(pixel/scale)));
-}
-
 MagickExport MagickBooleanType SetImageDepth(Image *image,
   const size_t depth)
 {
-  return(SetImageChannelDepth(image,AllChannels,depth));
+  return(SetImageChannelDepth(image,CompositeChannels,depth));
 }
 
 MagickExport MagickBooleanType SetImageChannelDepth(Image *image,
@@ -839,14 +832,14 @@ MagickExport MagickBooleanType SetImageChannelDepth(Image *image,
   ExceptionInfo
     *exception;
 
-  ssize_t
-    y;
-
   MagickBooleanType
     status;
 
   QuantumAny
-    scale;
+    range;
+
+  ssize_t
+    y;
 
   assert(image != (Image *) NULL);
   if (image->debug != MagickFalse)
@@ -862,8 +855,7 @@ MagickExport MagickBooleanType SetImageChannelDepth(Image *image,
     Scale pixels to desired depth.
   */
   status=MagickTrue;
-  scale=QuantumRange/((QuantumAny) QuantumRange >> (MAGICKCORE_QUANTUM_DEPTH-
-    depth));
+  range=GetQuantumRange(depth);
   exception=(&image->exception);
   image_view=AcquireCacheView(image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
@@ -893,16 +885,21 @@ MagickExport MagickBooleanType SetImageChannelDepth(Image *image,
     for (x=0; x < (ssize_t) image->columns; x++)
     {
       if ((channel & RedChannel) != 0)
-        q->red=SetPixelDepth(q->red,scale);
+        SetRedPixelComponent(q,ScaleAnyToQuantum(ScaleQuantumToAny(
+          GetRedPixelComponent(q),range),range));
       if ((channel & GreenChannel) != 0)
-        q->green=SetPixelDepth(q->green,scale);
+        SetGreenPixelComponent(q,ScaleAnyToQuantum(ScaleQuantumToAny(
+          GetGreenPixelComponent(q),range),range));
       if ((channel & BlueChannel) != 0)
-        q->green=SetPixelDepth(q->blue,scale);
+        SetBluePixelComponent(q,ScaleAnyToQuantum(ScaleQuantumToAny(
+          GetBluePixelComponent(q),range),range));
       if (((channel & OpacityChannel) != 0) && (image->matte != MagickFalse))
-        q->opacity=SetPixelDepth(q->opacity,scale);
+        SetOpacityPixelComponent(q,ScaleAnyToQuantum(ScaleQuantumToAny(
+          GetOpacityPixelComponent(q),range),range));
       if (((channel & IndexChannel) != 0) &&
           (image->colorspace == CMYKColorspace))
-        indexes[x]=SetPixelDepth(indexes[x],scale);
+        SetIndexPixelComponent(indexes+x,ScaleAnyToQuantum(ScaleQuantumToAny(
+          GetIndexPixelComponent(indexes+x),range),range));
       q++;
     }
     if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
@@ -914,9 +911,6 @@ MagickExport MagickBooleanType SetImageChannelDepth(Image *image,
   image_view=DestroyCacheView(image_view);
   if (image->storage_class == PseudoClass)
     {
-      QuantumAny
-        range;
-
       register ssize_t
         i;
 
@@ -924,20 +918,20 @@ MagickExport MagickBooleanType SetImageChannelDepth(Image *image,
         *restrict p;
 
       p=image->colormap;
-      range=GetQuantumRange(depth);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(dynamic,4) shared(status)
 #endif
       for (i=0; i < (ssize_t) image->colors; i++)
       {
         if ((channel & RedChannel) != 0)
-          p->red=SetPixelDepth(p->red,scale);
+          GetRedPixelComponent(p)=ScaleAnyToQuantum(ScaleQuantumToAny(GetRedPixelComponent(p),range),range);
         if ((channel & GreenChannel) != 0)
-          p->green=SetPixelDepth(p->green,scale);
+          GetGreenPixelComponent(p)=ScaleAnyToQuantum(ScaleQuantumToAny(GetGreenPixelComponent(p),range),range);
         if ((channel & BlueChannel) != 0)
-          p->blue=SetPixelDepth(p->blue,scale);
+          GetBluePixelComponent(p)=ScaleAnyToQuantum(ScaleQuantumToAny(GetBluePixelComponent(p),range),range);
         if ((channel & OpacityChannel) != 0)
-          p->opacity=SetPixelDepth(p->opacity,scale);
+          GetOpacityPixelComponent(p)=ScaleAnyToQuantum(ScaleQuantumToAny(GetOpacityPixelComponent(p),range),
+            range);
         p++;
       }
     }