diff --git a/magick/attribute.c b/magick/attribute.c
index bd85ee4..e2278b0 100644
--- a/magick/attribute.c
+++ b/magick/attribute.c
@@ -274,8 +274,17 @@
%
*/
-MagickExport size_t GetImageDepth(const Image *image,
- ExceptionInfo *exception)
+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));
}
@@ -338,19 +347,19 @@
status;
QuantumAny
- range;
+ scale;
status=0;
- range=GetQuantumRange(current_depth[id]);
+ scale=1;
+ if (depth < QuantumDepth)
+ scale=QuantumRange/((QuantumAny) QuantumRange >> (QuantumDepth-
+ current_depth[id]));
if ((channel & RedChannel) != 0)
- status|=p->red != ScaleAnyToQuantum(ScaleQuantumToAny(p->red,
- range),range);
+ status|=(QuantumAny) p->red != GetPixelDepth(p->red,scale);
if ((channel & GreenChannel) != 0)
- status|=p->green != ScaleAnyToQuantum(ScaleQuantumToAny(p->green,
- range),range);
+ status|=(QuantumAny) p->green != GetPixelDepth(p->green,scale);
if ((channel & BlueChannel) != 0)
- status|=p->blue != ScaleAnyToQuantum(ScaleQuantumToAny(p->blue,
- range),range);
+ status|=(QuantumAny) p->blue != GetPixelDepth(p->blue,scale);
if (status == 0)
break;
current_depth[id]++;
@@ -395,26 +404,24 @@
status;
QuantumAny
- range;
+ scale;
status=0;
- range=GetQuantumRange(current_depth[id]);
+ scale=1;
+ if (depth < QuantumDepth)
+ scale=QuantumRange/((QuantumAny) QuantumRange >> (QuantumDepth-
+ current_depth[id]));
if ((channel & RedChannel) != 0)
- status|=p->red != ScaleAnyToQuantum(ScaleQuantumToAny(p->red,range),
- range);
+ status|=(QuantumAny) p->red != GetPixelDepth(p->red,scale);
if ((channel & GreenChannel) != 0)
- status|=p->green != ScaleAnyToQuantum(ScaleQuantumToAny(p->green,
- range),range);
+ status|=(QuantumAny) p->green != GetPixelDepth(p->green,scale);
if ((channel & BlueChannel) != 0)
- status|=p->blue != ScaleAnyToQuantum(ScaleQuantumToAny(p->blue,range),
- range);
+ status|=(QuantumAny) p->blue != GetPixelDepth(p->blue,scale);
if (((channel & OpacityChannel) != 0) && (image->matte != MagickFalse))
- status|=p->opacity != ScaleAnyToQuantum(ScaleQuantumToAny(p->opacity,
- range),range);
+ status|=(QuantumAny) p->opacity != GetPixelDepth(p->opacity,scale);
if (((channel & IndexChannel) != 0) &&
(image->colorspace == CMYKColorspace))
- status|=indexes[x] != ScaleAnyToQuantum(ScaleQuantumToAny(indexes[x],
- range),range);
+ status|=(QuantumAny) indexes[x] != GetPixelDepth(indexes[x],scale);
if (status == 0)
break;
current_depth[id]++;
@@ -815,6 +822,12 @@
%
*/
+static inline Quantum SetPixelDepth(const Quantum pixel,
+ const QuantumAny scale)
+{
+ return((Quantum) (scale*(pixel/scale)));
+}
+
MagickExport MagickBooleanType SetImageDepth(Image *image,
const size_t depth)
{
@@ -837,7 +850,7 @@
status;
QuantumAny
- range;
+ scale;
assert(image != (Image *) NULL);
if (image->debug != MagickFalse)
@@ -853,7 +866,9 @@
Scale pixels to desired depth.
*/
status=MagickTrue;
- range=GetQuantumRange(depth);
+ scale=1;
+ if (depth < QuantumDepth)
+ scale=QuantumRange/((QuantumAny) QuantumRange >> (QuantumDepth-depth));
exception=(&image->exception);
image_view=AcquireCacheView(image);
#if defined(MAGICKCORE_OPENMP_SUPPORT)
@@ -883,16 +898,16 @@
for (x=0; x < (ssize_t) image->columns; x++)
{
if ((channel & RedChannel) != 0)
- q->red=ScaleAnyToQuantum(ScaleQuantumToAny(q->red,range),range);
+ q->red=SetPixelDepth(q->red,scale);
if ((channel & GreenChannel) != 0)
- q->green=ScaleAnyToQuantum(ScaleQuantumToAny(q->green,range),range);
+ q->green=SetPixelDepth(q->green,scale);
if ((channel & BlueChannel) != 0)
- q->blue=ScaleAnyToQuantum(ScaleQuantumToAny(q->blue,range),range);
+ q->green=SetPixelDepth(q->blue,scale);
if (((channel & OpacityChannel) != 0) && (image->matte != MagickFalse))
- q->opacity=ScaleAnyToQuantum(ScaleQuantumToAny(q->opacity,range),range);
+ q->opacity=SetPixelDepth(q->opacity,scale);
if (((channel & IndexChannel) != 0) &&
(image->colorspace == CMYKColorspace))
- indexes[x]=ScaleAnyToQuantum(ScaleQuantumToAny(indexes[x],range),range);
+ indexes[x]=SetPixelDepth(indexes[x],scale);
q++;
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
@@ -921,14 +936,13 @@
for (i=0; i < (ssize_t) image->colors; i++)
{
if ((channel & RedChannel) != 0)
- p->red=ScaleAnyToQuantum(ScaleQuantumToAny(p->red,range),range);
+ p->red=SetPixelDepth(p->red,scale);
if ((channel & GreenChannel) != 0)
- p->green=ScaleAnyToQuantum(ScaleQuantumToAny(p->green,range),range);
+ p->green=SetPixelDepth(p->green,scale);
if ((channel & BlueChannel) != 0)
- p->blue=ScaleAnyToQuantum(ScaleQuantumToAny(p->blue,range),range);
+ p->blue=SetPixelDepth(p->blue,scale);
if ((channel & OpacityChannel) != 0)
- p->opacity=ScaleAnyToQuantum(ScaleQuantumToAny(p->opacity,range),
- range);
+ p->opacity=SetPixelDepth(p->opacity,scale);
p++;
}
}