18 #ifndef MAGICKCORE_QUANTUM_PRIVATE_H 19 #define MAGICKCORE_QUANTUM_PRIVATE_H 21 #include "magick/memory_.h" 22 #include "magick/cache.h" 23 #include "magick/image-private.h" 24 #include "magick/pixel-accessor.h" 25 #include "magick/statistic-private.h" 27 #if defined(__cplusplus) || defined(c_plusplus) 92 extern MagickPrivate
void 95 static inline MagickSizeType GetQuantumRange(
const size_t depth)
106 max_depth=8*
sizeof(MagickSizeType);
107 return((MagickSizeType) ((one << (MagickMin(depth,max_depth)-1))+
108 ((one << (MagickMin(depth,max_depth)-1))-1)));
111 static inline float HalfToSinglePrecision(
const unsigned short half)
113 #define ExponentBias (127-15) 114 #define ExponentMask (0x7c00U) 115 #define ExponentShift 23 116 #define SignBitShift 31 117 #define SignificandShift 13 118 #define SignificandMask (0x00000400U) 120 typedef union _SinglePrecision
147 sign_bit=(
unsigned int) ((half >> 15) & 0x00000001);
148 exponent=(
unsigned int) ((half >> 10) & 0x0000001f);
149 significand=(
unsigned int) (half & 0x000003ff);
152 if (significand == 0)
153 value=sign_bit << SignBitShift;
156 while ((significand & SignificandMask) == 0)
162 significand&=(~SignificandMask);
163 exponent+=ExponentBias;
164 value=(sign_bit << SignBitShift) | (exponent << ExponentShift) |
165 (significand << SignificandShift);
169 if (exponent == SignBitShift)
171 value=(sign_bit << SignBitShift) | 0x7f800000;
172 if (significand != 0)
173 value|=(significand << SignificandShift);
177 exponent+=ExponentBias;
178 significand<<=SignificandShift;
179 value=(sign_bit << SignBitShift) | (exponent << ExponentShift) |
182 map.fixed_point=value;
183 return(map.single_precision);
186 static inline unsigned char *PopCharPixel(
const unsigned char pixel,
187 unsigned char *magick_restrict pixels)
193 static inline unsigned char *PopLongPixel(
const EndianType endian,
194 const unsigned int pixel,
unsigned char *magick_restrict pixels)
199 quantum=(
unsigned int) pixel;
200 if (endian == LSBEndian)
202 *pixels++=(
unsigned char) (quantum);
203 *pixels++=(
unsigned char) (quantum >> 8);
204 *pixels++=(
unsigned char) (quantum >> 16);
205 *pixels++=(
unsigned char) (quantum >> 24);
208 *pixels++=(
unsigned char) (quantum >> 24);
209 *pixels++=(
unsigned char) (quantum >> 16);
210 *pixels++=(
unsigned char) (quantum >> 8);
211 *pixels++=(
unsigned char) (quantum);
215 static inline unsigned char *PopShortPixel(
const EndianType endian,
216 const unsigned short pixel,
unsigned char *magick_restrict pixels)
222 if (endian == LSBEndian)
224 *pixels++=(
unsigned char) (quantum);
225 *pixels++=(
unsigned char) (quantum >> 8);
228 *pixels++=(
unsigned char) (quantum >> 8);
229 *pixels++=(
unsigned char) (quantum);
233 static inline const unsigned char *PushCharPixel(
234 const unsigned char *magick_restrict pixels,
235 unsigned char *magick_restrict pixel)
241 static inline const unsigned char *PushLongPixel(
const EndianType endian,
242 const unsigned char *magick_restrict pixels,
243 unsigned int *magick_restrict pixel)
248 if (endian == LSBEndian)
250 quantum=((
unsigned int) *pixels++);
251 quantum|=((
unsigned int) *pixels++ << 8);
252 quantum|=((
unsigned int) *pixels++ << 16);
253 quantum|=((
unsigned int) *pixels++ << 24);
257 quantum=((
unsigned int) *pixels++ << 24);
258 quantum|=((
unsigned int) *pixels++ << 16);
259 quantum|=((
unsigned int) *pixels++ << 8);
260 quantum|=((
unsigned int) *pixels++);
265 static inline const unsigned char *PushShortPixel(
const EndianType endian,
266 const unsigned char *magick_restrict pixels,
267 unsigned short *magick_restrict pixel)
272 if (endian == LSBEndian)
274 quantum=(
unsigned int) *pixels++;
275 quantum|=(
unsigned int) (*pixels++ << 8);
276 *pixel=(
unsigned short) (quantum & 0xffff);
279 quantum=(
unsigned int) (*pixels++ << 8);
280 quantum|=(
unsigned int) *pixels++;
281 *pixel=(
unsigned short) (quantum & 0xffff);
285 static inline const unsigned char *PushFloatPixel(
const EndianType endian,
286 const unsigned char *magick_restrict pixels,
287 MagickFloatType *magick_restrict pixel)
298 if (endian == LSBEndian)
300 quantum.unsigned_value=((
unsigned int) *pixels++);
301 quantum.unsigned_value|=((
unsigned int) *pixels++ << 8);
302 quantum.unsigned_value|=((
unsigned int) *pixels++ << 16);
303 quantum.unsigned_value|=((
unsigned int) *pixels++ << 24);
304 *pixel=quantum.float_value;
307 quantum.unsigned_value=((
unsigned int) *pixels++ << 24);
308 quantum.unsigned_value|=((
unsigned int) *pixels++ << 16);
309 quantum.unsigned_value|=((
unsigned int) *pixels++ << 8);
310 quantum.unsigned_value|=((
unsigned int) *pixels++);
311 *pixel=quantum.float_value;
315 static inline Quantum ScaleAnyToQuantum(
const QuantumAny quantum,
316 const QuantumAny range)
319 return(QuantumRange);
320 #if !defined(MAGICKCORE_HDRI_SUPPORT) 321 return((Quantum) ((
double) QuantumRange*(quantum*
322 MagickSafeReciprocal((
double) range))+0.5));
324 return((Quantum) ((
double) QuantumRange*(quantum*
325 MagickSafeReciprocal((
double) range))));
329 static inline QuantumAny ScaleQuantumToAny(
const Quantum quantum,
330 const QuantumAny range)
332 #if !defined(MAGICKCORE_HDRI_SUPPORT) 333 return((QuantumAny) ((MagickRealType) range*quantum/QuantumRange));
335 if ((IsNaN(quantum) != 0) || (quantum <= 0.0f))
336 return((QuantumAny) 0UL);
337 if ((range*(MagickRealType) quantum/(MagickRealType) QuantumRange) >= 18446744073709551615.0)
338 return((QuantumAny) MagickULLConstant(18446744073709551615));
339 return((QuantumAny) (range*(MagickRealType) quantum/(MagickRealType) QuantumRange+0.5));
343 #if (MAGICKCORE_QUANTUM_DEPTH == 8) 344 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
346 return((Quantum) value);
349 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
351 #if !defined(MAGICKCORE_HDRI_SUPPORT) 352 return((Quantum) ((value)/16843009UL));
354 return((Quantum) (value/16843009.0));
358 static inline Quantum ScaleMapToQuantum(
const MagickRealType value)
363 return(QuantumRange);
364 #if !defined(MAGICKCORE_HDRI_SUPPORT) 365 return((Quantum) (value+0.5));
367 return((Quantum) value);
371 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
373 #if !defined(MAGICKCORE_HDRI_SUPPORT) 374 return((
unsigned int) (16843009UL*quantum));
376 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
378 if ((16843009.0*quantum) >= 4294967295.0)
379 return(4294967295UL);
380 return((
unsigned int) (16843009.0*quantum+0.5));
384 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
386 if (quantum >= (Quantum) MaxMap)
387 return((
unsigned int) MaxMap);
388 #if !defined(MAGICKCORE_HDRI_SUPPORT) 389 return((
unsigned int) quantum);
391 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
393 return((
unsigned int) (quantum+0.5));
397 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
399 #if !defined(MAGICKCORE_HDRI_SUPPORT) 400 return((
unsigned short) (257UL*quantum));
402 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
404 if ((257.0*quantum) >= 65535.0)
406 return((
unsigned short) (257.0*quantum+0.5));
410 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
412 #if !defined(MAGICKCORE_HDRI_SUPPORT) 413 return((Quantum) ((value+128U)/257U));
415 return((Quantum) (value/257.0));
418 #elif (MAGICKCORE_QUANTUM_DEPTH == 16) 419 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
421 #if !defined(MAGICKCORE_HDRI_SUPPORT) 422 return((Quantum) (257U*value));
424 return((Quantum) (257.0*value));
428 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
430 #if !defined(MAGICKCORE_HDRI_SUPPORT) 431 return((Quantum) ((value)/MagickULLConstant(65537)));
433 return((Quantum) (value/65537.0));
437 static inline Quantum ScaleMapToQuantum(
const MagickRealType value)
442 return(QuantumRange);
443 #if !defined(MAGICKCORE_HDRI_SUPPORT) 444 return((Quantum) (value+0.5));
446 return((Quantum) value);
450 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
452 #if !defined(MAGICKCORE_HDRI_SUPPORT) 453 return((
unsigned int) (65537UL*quantum));
455 if ((IsNaN(quantum) != 0) || (quantum <= 0.0f))
457 if ((65537.0f*quantum) >= 4294967295.0f)
459 return((
unsigned int) (65537.0f*quantum+0.5f));
463 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
465 if (quantum >= (Quantum) MaxMap)
466 return((
unsigned int) MaxMap);
467 #if !defined(MAGICKCORE_HDRI_SUPPORT) 468 return((
unsigned int) quantum);
470 if ((IsNaN(quantum) != 0) || (quantum <= 0.0f))
472 return((
unsigned int) (quantum+0.5f));
476 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
478 #if !defined(MAGICKCORE_HDRI_SUPPORT) 479 return((
unsigned short) quantum);
481 if ((IsNaN(quantum) != 0) || (quantum <= 0.0f))
483 if (quantum >= 65535.0f)
485 return((
unsigned short) (quantum+0.5f));
489 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
491 return((Quantum) value);
493 #elif (MAGICKCORE_QUANTUM_DEPTH == 32) 494 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
496 #if !defined(MAGICKCORE_HDRI_SUPPORT) 497 return((Quantum) (16843009UL*value));
499 return((Quantum) (16843009.0*value));
503 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
505 return((Quantum) value);
508 static inline Quantum ScaleMapToQuantum(
const MagickRealType value)
512 if (value >= (Quantum) MaxMap)
513 return(QuantumRange);
514 #if !defined(MAGICKCORE_HDRI_SUPPORT) 515 return((Quantum) (65537.0f*value+0.5f));
517 return((Quantum) (65537.0f*value));
521 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
523 #if !defined(MAGICKCORE_HDRI_SUPPORT) 524 return((
unsigned int) quantum);
526 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
528 if ((quantum) >= 4294967295.0)
530 return((
unsigned int) (quantum+0.5));
534 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
536 if ((quantum/65537) >= (Quantum) MaxMap)
537 return((
unsigned int) MaxMap);
538 #if !defined(MAGICKCORE_HDRI_SUPPORT) 539 return((
unsigned int) ((quantum+MagickULLConstant(32768))/
540 MagickULLConstant(65537)));
542 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
544 return((
unsigned int) (quantum/65537.0+0.5));
548 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
550 #if !defined(MAGICKCORE_HDRI_SUPPORT) 551 return((
unsigned short) ((quantum+MagickULLConstant(32768))/
552 MagickULLConstant(65537)));
554 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
556 if ((quantum/65537.0) >= 65535.0)
558 return((
unsigned short) (quantum/65537.0+0.5));
562 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
564 #if !defined(MAGICKCORE_HDRI_SUPPORT) 565 return((Quantum) (65537UL*value));
567 return((Quantum) (65537.0*value));
570 #elif (MAGICKCORE_QUANTUM_DEPTH == 64) 571 static inline Quantum ScaleCharToQuantum(
const unsigned char value)
573 return((Quantum) (72340172838076673.0*value));
576 static inline Quantum ScaleLongToQuantum(
const unsigned int value)
578 return((Quantum) (4294967297.0*value));
581 static inline Quantum ScaleMapToQuantum(
const MagickRealType value)
586 return(QuantumRange);
587 return((Quantum) (281479271743489.0*value));
590 static inline unsigned int ScaleQuantumToLong(
const Quantum quantum)
592 return((
unsigned int) (quantum/4294967297.0+0.5));
595 static inline unsigned int ScaleQuantumToMap(
const Quantum quantum)
597 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
599 if ((quantum/281479271743489.0) >= MaxMap)
600 return((
unsigned int) MaxMap);
601 return((
unsigned int) (quantum/281479271743489.0+0.5));
604 static inline unsigned short ScaleQuantumToShort(
const Quantum quantum)
606 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
608 if ((quantum/281479271743489.0) >= 65535.0)
610 return((
unsigned short) (quantum/281479271743489.0+0.5));
613 static inline Quantum ScaleShortToQuantum(
const unsigned short value)
615 return((Quantum) (281479271743489.0*value));
619 static inline unsigned short SinglePrecisionToHalf(
const float value)
621 typedef union _SinglePrecision
650 map.single_precision=value;
651 sign_bit=(map.fixed_point >> 16) & 0x00008000;
652 exponent=(int) ((map.fixed_point >> ExponentShift) & 0x000000ff)-ExponentBias;
653 significand=map.fixed_point & 0x007fffff;
660 return((
unsigned short) sign_bit);
661 significand=significand | 0x00800000;
662 shift=(int) (14-exponent);
663 significand=(
unsigned int) ((significand+((1U << (shift-1))-1)+
664 ((significand >> shift) & 0x01)) >> shift);
665 return((
unsigned short) (sign_bit | significand));
668 if (exponent == (0xff-ExponentBias))
670 if (significand == 0)
671 return((
unsigned short) (sign_bit | ExponentMask));
674 significand>>=SignificandShift;
675 half=(
unsigned short) (sign_bit | significand |
676 (significand == 0) | ExponentMask);
680 significand=significand+((significand >> SignificandShift) & 0x01)+0x00000fff;
681 if ((significand & 0x00800000) != 0)
698 for (i=0; i < 10; i++)
700 return((
unsigned short) (sign_bit | ExponentMask));
702 half=(
unsigned short) (sign_bit | ((
unsigned int) exponent << 10) |
703 (significand >> SignificandShift));
707 #if defined(__cplusplus) || defined(c_plusplus)