+2010-01-01 6.5.9-0 Cristy <quetzlzacatenango@image...>
+ * Add support for compact floating point (i.e. -depth 16 -define
+ quantum:format=floating-point).
+
2010-01-05 6.5.9-0 Stephan Menzel <stephan.menzel@gmail...>
* Add support for the BGRA raw image format.
{ "FloatingPoint", (long) FloatingPointQuantumFormat, MagickFalse },
{ "Signed", (long) SignedQuantumFormat, MagickFalse },
{ "Unsigned", (long) UnsignedQuantumFormat, MagickFalse },
- { "CompactFloatingPoint", (long) CompactFloatingPointQuantumFormat, MagickFalse },
{ (char *) NULL, (long) FloatingPointQuantumFormat, MagickFalse }
},
ResolutionOptions[] =
}
case 16:
{
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ q=PopShortPixel(endian,ScaleFloatToHalf(QuantumScale*
+ indexes[x]),q);
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
q=PopShortPixel(endian,(unsigned short) indexes[x],q);
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ q=PopShortPixel(endian,(unsigned short) indexes[x],q);
+ pixel=ScaleFloatToHalf(QuantumScale*(QuantumRange-p->opacity));
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
q=PopShortPixel(endian,(unsigned short) indexes[x],q);
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*PixelIntensityToQuantum(p));
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*PixelIntensityToQuantum(p));
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*(QuantumRange-p->opacity));
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(PixelIntensityToQuantum(p));
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*p->red);
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(p->red);
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*p->green);
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(p->green);
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*p->blue);
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(p->blue);
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*(QuantumRange-p->opacity));
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort((Quantum) (QuantumRange-p->opacity));
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*p->opacity);
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(p->opacity);
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*indexes[x]);
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(indexes[x]);
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*p->red);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*p->green);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*p->blue);
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(p->red);
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*p->red);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*p->green);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*p->blue);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*(QuantumRange-p->opacity));
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(p->red);
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*p->red);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*p->green);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*p->blue);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*indexes[x]);
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(p->red);
register unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ pixel=ScaleFloatToHalf(QuantumScale*p->red);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*p->green);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*p->blue);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*indexes[x]);
+ q=PopShortPixel(endian,pixel,q);
+ pixel=ScaleFloatToHalf(QuantumScale*(QuantumRange-p->opacity));
+ q=PopShortPixel(endian,pixel,q);
+ p++;
+ q+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
pixel=ScaleQuantumToShort(p->red);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ indexes[x]=PushColormapIndex(image,RoundToQuantum(
+ (MagickRealType) QuantumRange*ScaleHalfToFloat(pixel)),
+ &range_exception);
+ *q=image->colormap[(long) indexes[x]];
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ indexes[x]=PushColormapIndex(image,RoundToQuantum(
+ (MagickRealType) QuantumRange*ScaleHalfToFloat(pixel)),
+ &range_exception);
+ *q=image->colormap[(long) indexes[x]];
+ p=PushShortPixel(endian,p,&pixel);
+ q->opacity=(Quantum) (QuantumRange-RoundToQuantum(
+ (MagickRealType) QuantumRange*ScaleHalfToFloat(pixel)));
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
}
break;
}
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ q->red=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ q->green=q->red;
+ q->blue=q->red;
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ q->red=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ q->green=q->red;
+ q->blue=q->red;
+ p=PushShortPixel(endian,p,&pixel);
+ q->opacity=(Quantum) (QuantumRange-RoundToQuantum(
+ (MagickRealType) QuantumRange*ScaleHalfToFloat(pixel)));
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ q->red=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ q->green=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ q->blue=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ q->opacity=(Quantum) (QuantumRange-RoundToQuantum(
+ (MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel)));
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ indexes[x]=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p+=quantum_info->pad;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ q->red=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ q->green=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ q->blue=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ q->red=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ q->green=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ q->blue=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ q->opacity=(Quantum) (QuantumRange-RoundToQuantum(
+ (MagickRealType) QuantumRange*ScaleHalfToFloat(pixel)));
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ q->red=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ q->green=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ q->blue=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ indexes[x]=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
unsigned short
pixel;
+ if (quantum_info->format == FloatingPointQuantumFormat)
+ {
+ for (x=0; x < (long) number_pixels; x++)
+ {
+ p=PushShortPixel(endian,p,&pixel);
+ q->red=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ q->green=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ q->blue=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ indexes[x]=RoundToQuantum((MagickRealType) QuantumRange*
+ ScaleHalfToFloat(pixel));
+ p=PushShortPixel(endian,p,&pixel);
+ q->opacity=(Quantum) (QuantumRange-RoundToQuantum(
+ (MagickRealType) QuantumRange*ScaleHalfToFloat(pixel)));
+ p+=quantum_info->pad;
+ q++;
+ }
+ break;
+ }
for (x=0; x < (long) number_pixels; x++)
{
p=PushShortPixel(endian,p,&pixel);
signature;
};
-typedef union _CompactFloat
+typedef union _HalfFloat
{
unsigned int
cf_uint;
float
cf_float;
-} CompactFloat;
+} HalfFloat;
static inline MagickSizeType GetQuantumRange(const unsigned long depth)
{
quantum_state->mask=mask;
}
-static inline unsigned short DecodeCompactFloatPixel(const float value)
-{
-#define ExponentBias (127-15)
-#define ExponentMask 0x7c00
-#define ExponentShift 23
-#define MantissaShift 13
-
- CompactFloat
- decode;
-
- register int
- exponent;
-
- register unsigned int
- mantissa,
- sign;
-
- unsigned short
- compact;
-
- decode.cf_float=value;
- sign=(decode.cf_uint >> 16) & 0x00008000;
- exponent=((decode.cf_uint >> ExponentShift) & 0x000000ff)-
- ExponentBias;
- mantissa=decode.cf_uint & 0x007fffff;
- if (exponent <= 0)
- {
- long
- shift;
-
- if (exponent < -10)
- return(sign);
- mantissa=mantissa | 0x00800000;
- shift=14-exponent;
- mantissa=(mantissa+((1 << (shift-1))-1)+((mantissa >> shift) & 0x01)) >>
- shift;
- return((unsigned short) (sign | mantissa));
- }
- else
- if (exponent == (0xff-ExponentBias))
- {
- if (mantissa == 0)
- return(sign | ExponentMask);
- else
- {
- mantissa>>=MantissaShift;
- compact=(unsigned short) (sign | mantissa | (mantissa == 0) |
- ExponentMask);
- return(compact);
- }
- }
- mantissa=mantissa+((mantissa >> MantissaShift) & 0x01)+0x00000fff;
- if ((mantissa & 0x00800000) != 0)
- {
- mantissa=0;
- exponent++;
- }
- if (exponent > 30)
- {
- float
- alpha;
-
- register long
- i;
-
- /*
- Float overflow.
- */
- alpha=1e10;
- for (i=0; i < 10; i++)
- alpha*=alpha;
- return((unsigned short) (sign | ExponentMask));
- }
- compact=(unsigned short) (sign | (exponent << 10) |
- (mantissa >> MantissaShift));
- return(compact);
-}
-
-static inline float EncodeCompactFloatPixel(const unsigned short quantum)
-{
-#define MantissaMask 0x00000400
-#define SignShift 31
-
- CompactFloat
- encode;
-
- register unsigned int
- exponent,
- mantissa,
- sign;
-
- unsigned int
- value;
-
- sign=(quantum >> 15) & 0x00000001;
- exponent=(quantum >> 10) & 0x0000001f;
- mantissa=quantum & 0x000003ff;
- if (exponent == 0)
- {
- if (mantissa == 0)
- value=sign << SignShift;
- else
- {
- while ((mantissa & MantissaMask) == 0)
- {
- mantissa<<=1;
- exponent--;
- }
- exponent++;
- mantissa&=(~MantissaMask);
- exponent+=ExponentBias;
- value=(sign << SignShift) | (exponent << ExponentShift) |
- (mantissa << MantissaShift);
- }
- }
- else
- if (exponent == SignShift)
- {
- value=(sign << SignShift) | 0x7f800000;
- if (mantissa != 0)
- value|=(mantissa << MantissaShift);
- }
- else
- {
- exponent+=ExponentBias;
- mantissa=mantissa << MantissaShift;
- value=(sign << SignShift) | (exponent << ExponentShift) | mantissa;
- }
- encode.cf_uint=value;
- return(encode.cf_float);
-}
-
static inline unsigned char *PopCharPixel(const unsigned char pixel,
unsigned char *pixels)
{
#endif
}
+static inline unsigned short ScaleFloatToHalf(const float value)
+{
+#define ExponentBias (127-15)
+#define ExponentMask 0x7c00
+#define ExponentShift 23
+#define MantissaShift 13
+
+ HalfFloat
+ pixel;
+
+ register int
+ exponent;
+
+ register unsigned int
+ mantissa,
+ sign;
+
+ unsigned short
+ half;
+
+ pixel.cf_float=value;
+ sign=(pixel.cf_uint >> 16) & 0x00008000;
+ exponent=(int) ((pixel.cf_uint >> ExponentShift) & 0x000000ff)-
+ ExponentBias;
+ mantissa=pixel.cf_uint & 0x007fffff;
+ if (exponent <= 0)
+ {
+ long
+ shift;
+
+ if (exponent < -10)
+ return((unsigned short) sign);
+ mantissa=mantissa | 0x00800000;
+ shift=14-exponent;
+ mantissa=(unsigned int) ((mantissa+((1 << (shift-1))-1)+
+ ((mantissa >> shift) & 0x01)) >> shift);
+ return((unsigned short) (sign | mantissa));
+ }
+ else
+ if (exponent == (0xff-ExponentBias))
+ {
+ if (mantissa == 0)
+ return((unsigned short) (sign | ExponentMask));
+ else
+ {
+ mantissa>>=MantissaShift;
+ half=(unsigned short) (sign | mantissa | (mantissa == 0) |
+ ExponentMask);
+ return(half);
+ }
+ }
+ mantissa=mantissa+((mantissa >> MantissaShift) & 0x01)+0x00000fff;
+ if ((mantissa & 0x00800000) != 0)
+ {
+ mantissa=0;
+ exponent++;
+ }
+ if (exponent > 30)
+ {
+ float
+ alpha;
+
+ register long
+ i;
+
+ /*
+ Float overflow.
+ */
+ alpha=1e10;
+ for (i=0; i < 10; i++)
+ alpha*=alpha;
+ return((unsigned short) (sign | ExponentMask));
+ }
+ half=(unsigned short) (sign | (exponent << 10) |
+ (mantissa >> MantissaShift));
+ return(half);
+}
+
+static inline float ScaleHalfToFloat(const unsigned short quantum)
+{
+#define MantissaMask 0x00000400
+#define SignShift 31
+
+ HalfFloat
+ pixel;
+
+ register unsigned int
+ exponent,
+ mantissa,
+ sign;
+
+ unsigned int
+ value;
+
+ sign=(unsigned int) ((quantum >> 15) & 0x00000001);
+ exponent=(unsigned int) ((quantum >> 10) & 0x0000001f);
+ mantissa=(unsigned int) (quantum & 0x000003ff);
+ if (exponent == 0)
+ {
+ if (mantissa == 0)
+ value=sign << SignShift;
+ else
+ {
+ while ((mantissa & MantissaMask) == 0)
+ {
+ mantissa<<=1;
+ exponent--;
+ }
+ exponent++;
+ mantissa&=(~MantissaMask);
+ exponent+=ExponentBias;
+ value=(sign << SignShift) | (exponent << ExponentShift) |
+ (mantissa << MantissaShift);
+ }
+ }
+ else
+ if (exponent == SignShift)
+ {
+ value=(sign << SignShift) | 0x7f800000;
+ if (mantissa != 0)
+ value|=(mantissa << MantissaShift);
+ }
+ else
+ {
+ exponent+=ExponentBias;
+ mantissa=mantissa << MantissaShift;
+ value=(sign << SignShift) | (exponent << ExponentShift) | mantissa;
+ }
+ pixel.cf_uint=value;
+ return(pixel.cf_float);
+}
+
static inline QuantumAny ScaleQuantumToAny(const Quantum quantum,
const QuantumAny range)
{
default: break;
}
if (quantum_info->pack == MagickFalse)
- return((size_t) (packet_size*image->columns*((image->depth+7)/8)));
- return((size_t) ((packet_size*image->columns*image->depth+7)/8));
+ return((size_t) (packet_size*image->columns*((quantum_info->depth+7)/8)));
+ return((size_t) ((packet_size*image->columns*quantum_info->depth+7)/8));
}
\f
/*
if (quantum_info->depth > 32)
quantum_info->depth=64;
else
- quantum_info->depth=32;
+ if (quantum_info->depth > 16)
+ quantum_info->depth=32;
+ else
+ quantum_info->depth=16;
}
- if (quantum_info->format == CompactFloatingPointQuantumFormat)
- quantum_info->depth=16;
if (quantum_info->pixels != (unsigned char **) NULL)
DestroyQuantumPixels(quantum_info);
status=AcquireQuantumPixels(quantum_info,(quantum_info->pad+5)*image->columns*
UndefinedQuantumFormat,
FloatingPointQuantumFormat,
SignedQuantumFormat,
- UnsignedQuantumFormat,
- CompactFloatingPointQuantumFormat
+ UnsignedQuantumFormat
} QuantumFormatType;
typedef enum